Spark SQL中Unix时间戳转换返回错误结果求助
问题排查与解决
这是个典型的时间格式符混淆问题,我来帮你拆解原因和解决办法:
核心问题:格式符用错了
你在时间格式串里用的hh是12小时制的小时标识(范围是1-12),但你要处理的是24小时制的时间,应该用HH(范围0-23)。
为什么会出现两种不同的结果?
- 对于
2017-02-23 12:45:00:用hh解析时,12会被识别为12小时制的凌晨12点(对应24小时制的00:00),所以unix_timestamp转换后的时间戳对应凌晨00:45,最终返回2017-02-23 00:45:00。 - 对于
2017-02-23 13:45:00:13超出了12小时制hh的合法范围(1-12),Spark的unix_timestamp会触发宽松解析逻辑,直接把它当作24小时制的小时处理,所以刚好返回了你预期的结果——这其实是个“巧合正确”的情况,并不符合格式定义的规范。
修正后的代码
把格式串里的hh替换成HH就能得到正确结果:
spark.sql("select from_unixtime(unix_timestamp('2017-02-23 12:45:00', 'yyyy-MM-dd HH:mm:ss'))").show(false)
执行后会返回预期的2017-02-23 12:45:00。
小提示
Spark SQL的时间格式遵循Java SimpleDateFormat的规则,一定要注意大小写区分:
hh→ 12小时制小时(1-12)HH→ 24小时制小时(0-23)mm是分钟,MM是月份,这些也容易搞混,记得多加留意。
内容的提问来源于stack exchange,提问作者Dinesh J
相关产品推荐
相关产品推荐

