如何在单条Spark SQL查询中转换西班牙语格式日期(如14-ENE-2021)
西语格式字符串转Spark日期类型问题
场景说明
- 现有导入文件的日期字段以字符串形式存储,采用西班牙语日期表达,典型值为
14-ENE-2021,其中ENE是西班牙语一月的固定缩写,整体格式结构为dd-MMM-yyyy - 需求为通过单条Spark SQL查询,将这类字符串转换为标准Date日期类型
- 已尝试执行语句
spark.sql("select TO_DATE('14-ENE-21', 'dd-MMM-yy')").show(),返回结果为null
为什么查询返回null
- Spark默认使用英语语言环境做日期解析,内置的月份缩写映射表仅覆盖英语月份短写,无法识别西语月份缩写,匹配失败时会直接返回null
- 测试语句本身存在结构偏差:测试样例用了两位年份
21,和实际存量数据的四位年份结构不匹配,即便指定正确的语言环境,格式对不上也无法完成解析
单条查询实现写法
针对实际存量的四位年份西语日期,可使用带语言环境参数的TO_DATE函数完成解析:SELECT TO_DATE('14-ENE-2021', 'dd-MMM-yyyy', 'es-ES') AS converted_date
关键逻辑说明:
- 第三个参数
es-ES指定解析过程使用西班牙语语言环境,让Spark加载西语月份的缩写映射规则,可正确识别ENE/FEB/MAR这类全大写的西语月缩写 - 如果数据中确实存在两位年份的西语日期(如测试用的
14-ENE-21),只需把格式模板替换为dd-MMM-yy即可,其他参数无需变动 - 格式模板必须和实际数据的结构严格对齐,年份位数、分隔符不匹配都会导致解析返回null
低版本兼容提示
- 上述带第三个参数的TO_DATE写法仅支持Spark 3.0及以上版本
- 若使用低版本Spark,可在会话初始化时全局设置西语语言环境:
spark.conf.set("spark.sql.locale", "es-ES"),设置完成后直接使用传统双参数的TO_DATE写法即可正常解析
内容的提问来源于stack exchange,提问作者eduardo0
相关产品推荐
相关产品推荐

