在 spark 中为日期填充缺失值的优雅方法

cph*_*sto 5 python date apache-spark fillna

让我把这个问题分解成一个更小的部分。我在PySpark,在那里我有一列中的数据帧arrival_datedate格式-

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)
Run Code Online (Sandbox Code Playgroud)

应用了很多转换到数据帧后,我终于想填充缺少的日期,标记为null01-01-1900

执行此操作的一种方法是将列转换arrival_dateString,然后以这种方式替换缺失值 -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'])
Run Code Online (Sandbox Code Playgroud)

文档说值必须是以下类型: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')))
Run Code Online (Sandbox Code Playgroud)

有没有办法,我可以date使用一些函数直接将我选择的日期分配给格式化的列?

有人有更好的建议吗?

zzz*_*zzk 4

第二种方法应该是这样做的方法,但是您不必使用 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')))
Run Code Online (Sandbox Code Playgroud)

  • 你好。如果您仔细阅读问题,我已经在“另一种方式”标题下提到了这个解决方案。但是,这是我想避免的事情。我想直接使用 .fillna() 来解决这个问题,避免 if/else。 (4认同)