You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AWS Glue的PySpark作业中处理字符串转日期时的空值问题

正确处理AWS Glue中带Null的日期字符串列转换方法

核心问题分析

你之前的问题主要出在三个点:

  1. fill不是pyspark.sql.functions中的函数,fillna是DataFrame自身的方法,无需导入;
  2. 使用when时可能未正确指定日期格式,或未正确处理Null判断逻辑;
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:05:19