Spark(Hive)夏令时无效时间转Timestamp的解决方案咨询
解决方案
针对夏令时导致的无效时段时间转换返回NULL的问题,可以通过判断转换结果,对无效时段的时间字符串做小时加1处理后重新转换来解决,无需修改数据源。
实现SQL示例
SELECT CASE -- 先尝试正常转换时间 WHEN to_timestamp(dt_str, 'yyyyMMdd HHmmss') IS NULL THEN -- 若转换失败,将原时间的小时部分加1后重新拼接转换 to_timestamp( concat( substr(dt_str, 1, 8), -- 提取日期部分(yyyyMMdd) ' ', lpad(cast(substr(dt_str, 10, 2) AS INT) + 1, 2, '0'), -- 小时加1并补零为两位 substr(dt_str, 12, 4) -- 提取分钟秒部分(mmss) ), 'yyyyMMdd HHmmss' ) ELSE to_timestamp(dt_str, 'yyyyMMdd HHmmss') END AS converted_timestamp FROM (SELECT '20220327 021500' AS dt_str) t
逻辑说明
- 先调用
to_timestamp尝试正常转换输入的时间字符串; - 若转换结果为NULL(说明该时间在当前时区不存在),则拆分原字符串:
- 截取前8位作为日期部分;
- 截取第10-11位作为小时,转成整数后加1,再用
lpad补零保证是两位格式; - 截取最后4位作为分钟秒部分;
- 将处理后的各部分重新拼接成合法的时间字符串,再次调用
to_timestamp完成转换。
官方文档补充说明
Spark 3.1版本中,如果指定的日期时间格式无效,from_unixtime、unix_timestamp、to_unix_timestamp、to_timestamp和to_date函数会执行失败;而在Spark 3.0及更早版本中,这些函数会返回NULL。
内容的提问来源于stack exchange,提问作者Pablo López Gallego
相关产品推荐
相关产品推荐

