Spark/Hive中如何将含不规则空格的日期字符串转换为Timestamp
问题解决方案
转换失败的三个核心原因:
- 格式串写死了固定空格数量,无法兼容字段间1个/多个空格的场景
- 用
dd格式符强制匹配两位日期,无法兼容个位数日期不带前导零的情况 - 额外嵌套一层
to_timestamp属于冗余写法,内层函数已经直接返回Timestamp类型,二次转换反而可能触发隐式格式转换报错
兼容两种格式的可行写法
先通过正则把字符串里所有连续空白字符合并为单个空格,再用适配1-2位日期的d格式符解析即可,代码逻辑在Spark SQL、Hive等支持标准to_timestamp的引擎中通用:
to_timestamp( regexp_replace(trim(DateColumn), '\\s+', ' '), 'MMM d yyyy h:mma', 'en-US' -- 若集群默认语言为英文可省略,否则必须添加,否则无法识别Mar/Apr这类英文月份缩写 )
逻辑说明
regexp_replace(trim(DateColumn), '\\s+', ' '):先去掉字符串首尾空格,再把中间任意数量的连续空格(1个、2个甚至更多异常多空格)全部替换为单个空格,彻底解决空格数量不固定的问题- 格式串用
d替代原来的dd:d可以自动匹配1位(如3)或2位(如27)的日期值,不需要日期补前导零 - 去掉冗余的外层
to_timestamp:函数执行后直接返回标准Timestamp类型,不需要二次转换
效果验证
- 输入
Mar 3 2022 8:30AM:正则替换后为Mar 3 2022 8:30AM,解析得到2022-03-03 08:30:00 - 输入
Apr 27 2022 7:37AM:正则替换后为Apr 27 2022 7:37AM,解析得到2022-04-27 07:37:00
内容的提问来源于stack exchange,提问作者ABusy_developerT
相关产品推荐
相关产品推荐

