让我把这个问题分解成一个更小的部分。我在 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'])
最后重新转换此列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
格式化的列?
有人有更好的建议吗?