Databricks Spark SQL的date_format函数预期输入日期格式是什么?
现象原因
date_format 函数的输入要求为日期/时间戳类型,如果你直接传入字符串参数,Spark会默认按照 ISO 8601标准日期格式 yyyy-MM-dd 做隐式类型转换:
- 输入
2021-07-09符合该格式,隐式转换为日期类型成功,因此可以正常返回格式化结果 - 输入
20-07-2021不符合该格式,隐式转换失败返回null,最终date_format输出null
Spark不会自动猜测YYYY-DD-MM等其他格式,是因为隐式转换只绑定了默认的ISO标准格式,没有自动尝试多格式匹配的逻辑,避免歧义。
多格式兼容实现方案
你需要先手动将多格式的字符串统一转换为日期类型,再调用date_format做格式化,根据你使用的Spark版本有两种实现方式:
1. Spark 3.0及以上版本
可以直接给to_date函数传入候选格式数组,函数会按顺序尝试匹配,直到找到符合的格式完成转换:
SELECT date_format( to_date( 待转换的日期字符串列, array('MM-dd-yyyy', 'yyyy-MM-dd', 'dd-MM-yyyy') ), '目标输出格式,例如yyyy年MM月dd日' ) as formatted_date FROM 你的表名
2. Spark 3.0以下版本
用coalesce函数嵌套多个指定不同格式的to_date,实现按顺序尝试转换的逻辑:
SELECT date_format( coalesce( to_date(待转换的日期字符串列, 'MM-dd-yyyy'), to_date(待转换的日期字符串列, 'yyyy-MM-dd'), to_date(待转换的日期字符串列, 'dd-MM-yyyy') ), '目标输出格式,例如yyyy-MM-dd' ) as formatted_date FROM 你的表名
注意:候选格式的顺序需要根据你的业务场景调整,遇到歧义日期(例如
01-02-2023)时,排在前面的格式会优先命中。
内容的提问来源于stack exchange,提问作者halfwind22
相关产品推荐
相关产品推荐

