#apache-spark #dataframe #pyspark #apache-spark-sql
#apache-spark #dataframe #pyspark #apache-spark-sql
Вопрос:
ИТАК, у меня есть следующий набор данных с форматом даты Месяц, день, год..
df = spark.read.format('csv').options(header = 'true').load("D:\datasets\googleplaystore.csv")
df.select('App', 'Last Updated').show()
Я получаю вывод
-------------------- ------------------
| App| Last Updated|
-------------------- ------------------
|Photo Editor amp; Ca...| January 7, 2018|
| Coloring book moana| January 15, 2018|
|U Launcher Lite –...| August 1, 2018|
|Sketch - Draw amp; P...| June 8, 2018|
|Pixel Draw - Numb...| June 20, 2018|
|Paper flowers ins...| March 26, 2017|
|Smoke Effect Phot...| April 26, 2018|
| Infinite Painter| June 14, 2018|
|Garden Coloring Book|September 20, 2017|
|Kids Paint Free -...| July 3, 2018|
|Text on Photo - F...| October 27, 2017|
|Name Art Photo Ed...| July 31, 2018|
|Tattoo Name On My...| April 2, 2018|
|Mandala Coloring ...| June 26, 2018|
|3D Color Pixel by...| August 3, 2018|
|Learn To Draw Kaw...| June 6, 2018|
Когда я пытаюсь преобразовать эту дату в определенный формат, скажите «ггггММдд»
df.select('App', date_format(('Last Updated'), "yyyyMMdd").alias("date")).show()
Я получаю
-------------------- ----
| App|date|
-------------------- ----
|Photo Editor amp; Ca...|null|
| Coloring book moana|null|
|U Launcher Lite –...|null|
|Sketch - Draw amp; P...|null|
|Pixel Draw - Numb...|null|
|Paper flowers ins...|null|
|Smoke Effect Phot...|null|
| Infinite Painter|null|
|Garden Coloring Book|null|
|Kids Paint Free -...|null|
|Text on Photo - F...|null|
|Name Art Photo Ed...|null|
|Tattoo Name On My...|null|
|Mandala Coloring ...|null|
|3D Color Pixel by...|null|
|Learn To Draw Kaw...|null|
|Photo Designer - ...|null|
|350 Diy Room Deco...|null|
Не уверен, где я ошибаюсь. Пожалуйста, помогите.
Мне также интересно, как я могу фильтровать по датам. Я знаю, что должен использовать lit (), lt, gt .. но я не уверен в правильном синтаксисе для этого набора данных.
Любая помощь была бы полезна.
Спасибо
Комментарии:
1.Это сработает —
from pyspark.sql.functions import col, to_date, date_format
df.select('App', date_format(to_date(col('Last_Updated'),'MMMMM dd, yyyy'), "yyyyMMdd").alias("date")).show()
2. Можете ли вы поделиться схемой столбцов.
df.printSchema()
Ответ №1:
Вот полное решение для обеих точек: —
Первая проблема — это синтаксический анализ даты —
date_format
принимает столбец даты и форматирует его в любую комбинацию. Но здесь Last Updated
есть столбец string. Для преобразования string
в date
требуется to_date
. Проверьте ниже, что я разобрал string
для date
.
data = sqlContext.createDataFrame([
["Photo Editor amp; Ca...", " January 7, 2018"],
[" Coloring book moana", " January 15, 2018"],
["U Launcher Lite –...", " August 1, 2018"],
["ketch - Draw amp; P...", " June 8, 2018"],
["Pixel Draw - Numb...", " June 20, 2018"],
["Paper flowers ins...", " March 26, 2017"],
["moke Effect Phot...", " April 26, 2018"],
[" Infinite Painter", " June 14, 2018"],
["Garden Coloring Book", "September 20, 2017"],
["Kids Paint Free -...", " July 3, 2018"],
["Text on Photo - F...", " October 27, 2017"],
["Name Art Photo Ed...", " July 31, 2018"],
["Tattoo Name On My...", " April 2, 2018"],
["Mandala Coloring ...", " June 26, 2018"],
["3D Color Pixel by...", " August 3, 2018"],
["Learn To Draw Kaw...", " June 6, 2018"]
], ["app", "Last Updated"])
from pyspark.sql import functions as F
parsed_date_data = data.withColumn(
"date",
F.to_date(
F.trim(F.col("Last Updated")),
"MMMM dd, yyyy"
)
)
parsed_date_data.show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
| Coloring book moana| January 15, 2018|2018-01-15|
|U Launcher Lite â...| August 1, 2018|2018-08-01|
| ketch - Draw amp; P...| June 8, 2018|2018-06-08|
|Pixel Draw - Numb...| June 20, 2018|2018-06-20|
|Paper flowers ins...| March 26, 2017|2017-03-26|
| moke Effect Phot...| April 26, 2018|2018-04-26|
| Infinite Painter| June 14, 2018|2018-06-14|
|Garden Coloring Book|September 20, 2017|2017-09-20|
|Kids Paint Free -...| July 3, 2018|2018-07-03|
|Text on Photo - F...| October 27, 2017|2017-10-27|
|Name Art Photo Ed...| July 31, 2018|2018-07-31|
|Tattoo Name On My...| April 2, 2018|2018-04-02|
|Mandala Coloring ...| June 26, 2018|2018-06-26|
|3D Color Pixel by...| August 3, 2018|2018-08-03|
|Learn To Draw Kaw...| June 6, 2018|2018-06-06|
-------------------- ------------------ ----------
Во-вторых, как мы можем применить фильтр к фрейму данных —
parsed_date_data.where("date = '2018-01-07'").show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
parsed_date_data.filter("date = '2018-01-07'").show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
parsed_date_data.where(F.col("date") == '2018-01-07').show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
parsed_date_data.filter(F.col("date") == '2018-01-07').show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
parsed_date_data.filter(parsed_date_data.date == '2018-01-07').show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
parsed_date_data.where(parsed_date_data.date == '2018-01-07').show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
parsed_date_data.where(parsed_date_data.date.isin('2018-01-07')).show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
parsed_date_data.filter(parsed_date_data.date.isin('2018-01-07')).show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|Photo Editor amp; Ca...| January 7, 2018|2018-01-07|
-------------------- ------------------ ----------
Хотя вы можете применять дополнительные фильтры —
parsed_date_data.filter(F.month(parsed_date_data.date) == '08').show()
-------------------- ------------------ ----------
| app| Last Updated| date|
-------------------- ------------------ ----------
|U Launcher Lite â...| August 1, 2018|2018-08-01|
|3D Color Pixel by...| August 3, 2018|2018-08-03|
-------------------- ------------------ ----------
Ответ №2:
Проблема, с которой вы получаете null, заключается в том, что date_format
ожидает current_date()
.
Итак, сначала вам нужно преобразовать ваше значение от 7 января 2018 года в date
тип с помощью функции to_date
.
scala> val df1 = df.withColumn("date format",to_date($"Last Updated","MMMMMM dd, yyyy"))
df1: org.apache.spark.sql.DataFrame = [App: string, Last Updated: string ... 1 more field]
scala> df1.show()
----------------- --------------- -----------
| App| Last Updated|date format|
----------------- --------------- -----------
|Photo Editor amp; Ca|January 7, 2018| 2018-01-07|
----------------- --------------- -----------
Затем примените date_format
.
scala> val df2 = df1.withColumn("date",date_format($"date format","yyyyMMdd"))
df2: org.apache.spark.sql.DataFrame = [App: string, Last Updated: string ... 2 more fields]
scala> df2.show()
----------------- --------------- ----------- --------
| App| Last Updated|date format| date|
----------------- --------------- ----------- --------
|Photo Editor amp; Ca|January 7, 2018| 2018-01-07|20180107|
----------------- --------------- ----------- --------
Ссылка: