火花SQL不转换时区正确
问题描述:
使用阶2.10.4和火花1.5.1和火花1.6火花SQL不转换时区正确
sqlContext.sql(
"""
|select id,
|to_date(from_utc_timestamp(from_unixtime(at), 'US/Pacific')),
|from_utc_timestamp(from_unixtime(at), 'US/Pacific'),
|from_unixtime(at),
|to_date(from_unixtime(at)),
| at
|from events
| limit 100
""".stripMargin).collect().foreach(println)
火花提交选项: --driver-java-options '-Duser.timezone=US/Pacific'
结果:
[56d2a9573bc4b5c38453eae7,2016-02-28,2016-02-27 16:01:27.0,2016-02-28 08:01:27,2016-02-28,1456646487]
[56d2aa1bfd2460183a571762,2016-02-28,2016-02-27 16:04:43.0,2016-02-28 08:04:43,2016-02-28,1456646683]
[56d2aaa9eb63bbb63456d5b5,2016-02-28,2016-02-27 16:07:05.0,2016-02-28 08:07:05,2016-02-28,1456646825]
[56d2aab15a21fa5f4c4f42a7,2016-02-28,2016-02-27 16:07:13.0,2016-02-28 08:07:13,2016-02-28,1456646833]
[56d2aac8aeeee48b74531af0,2016-02-28,2016-02-27 16:07:36.0,2016-02-28 08:07:36,2016-02-28,1456646856]
[56d2ab1d87fd3f4f72567788,2016-02-28,2016-02-27 16:09:01.0,2016-02-28 08:09:01,2016-02-28,1456646941]
的美国/太平洋时间应为2016-02-28 00:01:27
等,但一些它如何两次减去“8”小时
答
读了一段时间后,以下是结论:
- 星火-SQL不支持日期,时间,和时区也
- 使用时间戳唯一的解决办法
-
from_unixtime(at)
正确地分析了划时代的时间,只是将它打印为字符串会因时区而改变它。假设from_unixtime
可以正确转换它(尽管打印它可能会显示不同的结果)是安全的 -
from_utc_timestamp
将会将时间戳移位(不仅仅是转换)到该时区,在这种情况下,它会将时间减去8小时(-08:00) - 打印SQL结果为:时代弄乱到时区PARAM
答
为了记录在案,这里我们把这样的使用UDF长值。
为了我们的目的,我们(因为在UTC时代毫秒)
val udfToDateUTC = udf((epochMilliUTC: Long) => {
val dateFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(java.time.ZoneId.of("UTC"))
dateFormatter.format(java.time.Instant.ofEpochMilli(epochMilliUTC))
})
这种方式感兴趣的只是时间戳的日期字符串表示,我们控制了解析,以及日期的渲染。
from_unixtime(at)做什么from_utc_timestamp也会做,它会解析一个Unix时间戳整数(自1970-01-01午夜以来的秒数),并将从UTC解析的时间转换为系统的默认时区。 – user180940