Databricks SQL执行to_date时触发PARSE_DATETIME_BY_NEW_PARSER错误
解决Spark 3.0+中Databricks日期解析PARSE_DATETIME_BY_NEW_PARSER错误
错误原因
你的ORDERDATE列存在两种日期格式的字符串:一种是带时间的M/dd/yyyy H:mm(如10/10/2003 0:00),另一种是不带时间的M/d/yyyy(如错误提示里的5/7/2003)。Spark 3.0+默认启用的CORRECTED日期解析器对格式匹配要求严格,当字符串格式与指定的M/dd/yyyy H:mm完全不符时(比如缺失时间部分),就会触发解析错误。而单个带时间的字符串能正常解析,是因为它完全匹配指定格式。
解决方案
方法1:切换到LEGACY解析模式
临时设置会话参数,恢复Spark 3.0之前的宽松解析行为,兼容格式不严格的日期字符串:
SET spark.sql.legacy.timeParserPolicy = LEGACY; -- 之后执行你的查询 SELECT to_date(ORDERDATE, 'M/dd/yyyy H:mm') FROM sales_kaggle_chart LIMIT 10;
这种方式快速有效,但长期来看,建议使用更规范的格式处理逻辑,避免依赖旧行为。
方法2:兼容多种日期格式解析
用coalesce函数依次尝试多种可能的格式,直到找到能解析的格式:
SELECT coalesce( to_date(ORDERDATE, 'M/dd/yyyy H:mm'), to_date(ORDERDATE, 'M/d/yyyy'), to_date(ORDERDATE, 'MM/d/yyyy') -- 可选,覆盖更多潜在格式 ) AS order_date FROM sales_kaggle_chart LIMIT 10;
coalesce会返回第一个解析成功的结果,完美适配列中格式不统一的情况。
方法3:统一清洗日期字符串
先将所有日期字符串标准化为同一种格式,再进行解析:
SELECT to_date( -- 给不带时间的字符串补全默认时间 CASE WHEN instr(ORDERDATE, ' ') = 0 THEN concat(ORDERDATE, ' 0:00') ELSE ORDERDATE END, 'M/dd/yyyy H:mm' ) AS order_date FROM sales_kaggle_chart LIMIT 10;
这种方式从根源上统一数据格式,适合长期维护的数据集。
内容的提问来源于stack exchange,提问作者Bharathan Kumaran
相关产品推荐
相关产品推荐

