Spark3.0+新日期解析器报错INCONSISTENT_BEHAVIOR_CROSS_VERSION求助
Spark 3.x 日期解析适配方案(替代LEGACY模式)
问题核心
Spark 3.0+ 默认启用了新的日期时间解析器,它严格遵循java.time.format.DateTimeFormatter规范,和旧解析器的宽松行为存在差异。你的日期字符串存在两个关键不兼容点:
- 月份/日期可能是单数字格式(比如
1/1/2023),但原指定格式MM/dd/yyyy要求必须是两位数(01/01/2023) - 日期与时间之间可能存在多个空格(比如示例中的
12/22/2022 3:11:44 AM有两个空格)
适配新解析器的两种可行方案
方案1:修改日期格式字符串,兼容单数字和多空格
使用M/d/yyyy hh:mm:ss a替代原格式:
M:匹配1位或2位的月份(同时兼容1和01)d:匹配1位或2位的日期(同时兼容1和01)- 格式中的单个空格会自动匹配字符串中的一个或多个空格
修改后的代码:
from pyspark.sql import functions as F emp = [(1, "AAA", "dept1", 1000, "12/22/2022 3:11:44 AM"), (2, "BBB", "dept1", 1100, "12/22/2022 3:11:44 AM"), (3, "CCC", "dept1", 3000, "12/22/2022 3:11:44 AM"), (4, "DDD", "dept1", 1500, "12/22/2022 3:11:44 AM"), (5, "EEE", "dept2", 8000, "12/22/2022 3:11:44 AM"), (6, "FFF", "dept2", 7200, "12/22/2022 3:11:44 AM"), (7, "GGG", "dept3", 7100, "12/22/2022 3:11:44 AM"), (8, "HHH", "dept3", 3700, "12/22/2022 3:11:44 PM"), (9, "III", "dept3", 4500, "12/22/2022 3:11:44 PM"), (10, "JJJ", "dept5", 3400,"12/22/2022 3:11:44 PM")] empdf = spark.createDataFrame(emp, ["id", "name", "dept", "salary", "date"]) # 使用兼容单数字和多空格的格式 df = empdf.withColumn("date", F.to_timestamp(col("date"), "M/d/yyyy hh:mm:ss a")) df.show(12,False)
方案2:预处理日期字符串,统一格式
如果日期字符串格式不固定,可先清理多余空格,再进行解析:
from pyspark.sql import functions as F # 第一步:清理字符串中的多个空格,替换为单个空格 # 第二步:使用兼容格式解析日期 df = empdf.withColumn("clean_date", F.regexp_replace(col("date"), "\\s+", " ") ).withColumn("date", F.to_timestamp(col("clean_date"), "M/d/yyyy hh:mm:ss a") ).drop("clean_date") df.show(12,False)
额外优化建议
- 若存在少量无效日期字符串,可使用
try_cast避免任务失败,无效日期会被转为null:df = empdf.withColumn("date", F.try_cast(F.to_timestamp(col("date"), "M/d/yyyy hh:mm:ss a"))) - 新解析器的行为更规范、跨版本一致性更强,建议优先适配而非长期依赖LEGACY模式
内容的提问来源于stack exchange,提问作者Shailendra Kumar
相关产品推荐
相关产品推荐

