Элегантный способ заполнить пропущенные значения для дат в искре - PullRequest
0 голосов
/ 14 января 2019

Позвольте мне разбить эту проблему на меньший кусок. У меня есть DataFrame в PySpark, где у меня есть столбец arrival_date в формате date -

from pyspark.sql.functions import to_date
values = [('22.05.2016',),('13.07.2010',),('15.09.2012',),(None,)]
df = sqlContext.createDataFrame(values,['arrival_date'])

#Following code line converts String into Date format
df = df.withColumn('arrival_date',to_date(col('arrival_date'),'dd.MM.yyyy'))
df.show()
+------------+
|arrival_date|
+------------+
|  2016-05-22|
|  2010-07-13|
|  2012-09-15|
|        null|
+------------+

df.printSchema()
root
 |-- arrival_date: date (nullable = true)

После применения большого количества преобразований к DataFrame я, наконец, хочу заполнить отсутствующие даты, помеченные как null с помощью 01-01-1900.

Один из способов сделать это - преобразовать столбец arrival_date в String, а затем заменить отсутствующие значения таким образом - df.fillna('1900-01-01',subset=['arrival_date']) и, наконец, преобразовать этот столбец to_date. Это очень некрасиво.

Следующая строка кода не работает, как и ожидалось, и я получаю ошибку-

df = df.fillna(to_date(lit('1900-01-01'),'yyyy-MM-dd'), subset=['arrival_date'])

В документации сказано: Значение должно быть следующего типа: Int, Long, Float, Double, String, Boolean.

Другим способом является использование withColumn() и when() -

df = df.withColumn('arrival_date',when(col('arrival_date').isNull(),to_date(lit('01.01.1900'),'dd.MM.yyyy')).otherwise(col('arrival_date')))

Есть ли способ, где я мог бы напрямую назначить дату по своему выбору для столбца в формате date с помощью какой-либо функции?

У кого-нибудь есть лучшее предложение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...