Spark 3.0多格式日期验证失败,求有效解决方法
解决Spark 3.0多日期格式解析报错问题
问题原因
你写的代码里,to_date(col('inputDates'), "yyyy-MM-dd")遇到不符合格式的字符串(比如"15-03-2023")时,Spark 3.0会直接抛出**java.text.ParseException: 无法解析日期: "15-03-2023"**的异常,而非返回null。这导致when(...isNotNull())的判断逻辑根本没机会执行——因为解析失败时程序直接报错中断了。
可行解决方案
方法1:用try_cast安全解析(Spark 3.0+支持)
try_cast会尝试将字符串转为日期类型,失败时返回null,不会抛出异常。结合coalesce可以依次尝试多种日期格式:
from pyspark.sql.functions import * df = spark.createDataFrame([["2023-03-11"], ["15-03-2023"]], ["inputDates"]) df1 = df.select( coalesce( try_cast(col("inputDates").cast("date")), # 优先尝试yyyy-MM-dd格式 to_date(col("inputDates"), "dd-MM-yyyy") # 失败则尝试dd-MM-yyyy格式 ).alias("parsed_date") ) display(df1)
方法2:正则匹配格式后再解析
先通过正则判断字符串的格式类型,再选择对应的to_date规则解析,避免无效解析触发异常:
from pyspark.sql.functions import * df = spark.createDataFrame([["2023-03-11"], ["15-03-2023"]], ["inputDates"]) df1 = df.select( when( col("inputDates").rlike("^\\d{4}-\\d{2}-\\d{2}$"), to_date(col("inputDates"), "yyyy-MM-dd") ).when( col("inputDates").rlike("^\\d{2}-\\d{2}-\\d{4}$"), to_date(col("inputDates"), "dd-MM-yyyy") ).otherwise(None).alias("parsed_date") ) display(df1)
补充说明
- Spark 3.0默认是严格日期解析模式,解析失败直接报错。如果要全局启用宽松模式,可以设置配置:
spark.sql.legacy.timeParserPolicy=LEGACY,但不推荐这种方式,容易引入其他潜在问题。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

