Spark-SQL如何正确解析'MM/dd/yyyy HH:mm:ss.SSS'格式的毫秒值
Spark SQL 毫秒丢失问题修复方案
问题根因
unix_timestamp()函数仅返回秒级时间戳,解析时间字符串时会直接截断毫秒部分,源数据中的毫秒值在解析阶段就已经丢失,后续格式化无法还原。- 原格式化字符串存在语法错误:
yyyy-MM-dd HH:mm:ss.sss中小写s对应秒单位,连续3个小写s会重复输出秒值而非毫秒,毫秒的正确占位符为大写S。
修复代码
将原unix_timestamp + from_unixtime的组合替换为支持毫秒级处理的to_timestamp + date_format组合即可,修正后代码如下:
spark.sql(""" select case when trim(map('OPT OUT',1,'OPT IN',0,'',0)[coalesce(upper(program_1),'')]) == trim(num_fg) then trim(date_format(to_timestamp(upd_dt,'MM/dd/yyyy HH:mm:ss.SSS'), 'yyyy-MM-dd HH:mm:ss.SSS')) else Now() end as upd_dt from input """).show(false)
验证效果
使用提供的样例数据运行修正后代码,返回结果为2020-07-21 09:09:09.382,完整保留了输入的毫秒值,符合预期。
内容的提问来源于stack exchange,提问作者Only developer
相关产品推荐
相关产品推荐

