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

Spark中如何校验yyyyMMdd日期格式并将非法日期自动置为null

问题原因

Spark 3.0及以上版本默认将日期时间解析策略设置为EXCEPTION,遇到不符合指定格式的输入字符串时会直接抛出解析异常,而非返回null。你遇到的报错就是因为输入值2171121只有7位,不符合yyyyMMdd要求的8位长度,触发了解析失败异常。

解决方案

方案1:使用try_to_date函数(推荐,Spark 3.0+适用)

Spark 3.0新增了容错解析函数try_to_date,解析成功返回对应日期值,解析失败自动返回null,无需额外配置即可满足需求,修改后的代码如下:

DF = DF.withColumn("DATE", try_to_date(trim(col("DATE")), "yyyyMMdd"))

该方案不仅会校验字符串格式,还会自动校验日期本身的合法性,比如20230230这类不存在的日期也会返回null。

方案2:格式预校验(Spark 2.x适用)

如果使用的是没有try_to_date的低版本Spark,可以先通过正则表达式对输入字符串做格式校验,符合规则再做日期转换,否则返回null:

from pyspark.sql.functions import when, regexp_like, trim, col, to_date

DF = DF.withColumn("DATE", 
    when(
        # 先校验是否为8位纯数字
        regexp_like(trim(col("DATE")), r'^\d{8}$'),
        to_date(trim(col("DATE")), "yyyyMMdd")
    ).otherwise(None)
)

如果需要额外校验日期合法性,可以配合将当前会话的时间解析策略临时调整为LEGACY:

spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")

调整后格式合法但日期不存在的输入也会自动返回null,不会抛出异常。


内容的提问来源于stack exchange,提问作者Avinash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:57:02