巧妙地填充Spark中日期缺失值的方法

时间:2019-01-14 11:22:55

标签: python date apache-spark fillna

让我将此问题分解为较小的部分。我在PySpark中有一个DataFrame,其中有一个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']),最后重新转换此列{ {1}}。这很没有意思。

以下代码行无法正常运行,并且出现错误-

to_date

文档说 The value must be of the following type: Int, Long, Float, Double, String, Boolean.

另一种方法是使用df = df.fillna(to_date(lit('1900-01-01'),'yyyy-MM-dd'), subset=['arrival_date']) 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'))) 格式的列?

有人有更好的建议吗?

1 个答案:

答案 0 :(得分:0)

第二种方法应该是这样做的,但是您不必使用to_date在字符串和日期之间进行转换,只需使用datetime.date(1900,1,1)。

import datetime as dt
df = df.withColumn('arrival_date', when(col('arrival_date').isNull(), dt.date(1900, 1, 1)).otherwise(col('arrival_date')))