在AWS Glue的PySpark作业中处理字符串转日期时的空值问题
正确处理AWS Glue中带Null的日期字符串列转换方法
核心问题分析
你之前的问题主要出在三个点:
fill不是pyspark.sql.functions中的函数,fillna是DataFrame自身的方法,无需导入;- 使用
when时可能未正确指定日期格式,或未正确处理Null判断逻辑; to_date传入None作为格式时,PySpark会使用默认的yyyy-MM-dd格式,如果你的日期是dd.MM.yyyy这类非默认格式,会导致转换失败,而非Null的问题。
解决方法
方法1:直接用to_date保留Null(推荐)
to_date本身可以处理Null值,只要指定正确的日期格式即可,转换后Null会保留为Null,不会报错:
from pyspark.sql.functions import to_date # 假设你的日期格式是dd.MM.yyyy,替换成实际格式 df_spark = df_spark.withColumn("booking", to_date(df_spark["booking"], "dd.MM.yyyy"))
方法2:将Null替换为虚拟日期后转换
如果需要把Null替换成1900-01-01这类虚拟日期,有两种实现方式:
方式A:先转换日期,再替换Null
from pyspark.sql.functions import to_date # 先转换日期,保留原始Null df_spark = df_spark.withColumn("booking", to_date(df_spark["booking"], "dd.MM.yyyy")) # 用fillna替换Null为指定日期(注意日期格式要符合yyyy-MM-dd) df_spark = df_spark.fillna({"booking": "1900-01-01"})
方式B:先替换字符串Null,再转换日期
from pyspark.sql.functions import when, lit, to_date # 先把字符串类型的Null替换为虚拟日期字符串,再转换为日期类型 df_spark = df_spark.withColumn( "booking", when(df_spark["booking"].isNull(), lit("01.01.1900")).otherwise(df_spark["booking"]) ) df_spark = df_spark.withColumn("booking", to_date(df_spark["booking"], "dd.MM.yyyy"))
注意事项
- 务必确认你的日期字符串格式,比如
dd.MM.yyyy、yyyy-MM-dd等,to_date的第二个参数必须和实际格式匹配; - 如果存在格式不合法的非Null日期字符串,转换后会变成Null,可结合
try_cast函数避免报错(需Spark 3.0+):try_cast(df_spark["booking"].cast("date"))
内容的提问来源于stack exchange,提问作者Jigar
相关产品推荐
相关产品推荐

