【问题标题】:Hive timestamp ISO to UTC conversionHive 时间戳 ISO 到 UTC 转换
【发布时间】:2016-03-11 17:27:35
【问题描述】:

我有带有 ISO 8601 时间戳的字符串,例如 2016-03-07T10:02:37.820+01:00,我想将它们转换为 UTC 时间。内置的 to_utc_timestamp (AFAIK) 只需要时区名称(例如 PST、CET)而不是偏移量。至少我尝试过并且失败了。在 Hive 中是否有一种优雅的方式来实现这一点?

【问题讨论】:

  • 一方面很容易将事物拆分为2016-03-07T10:02:37,另一方面是+1。所以你可以得到一个unix_timestamp(concat('2016-03-07T10:02:37',' UTC'),'yyyy-MM-ddThh:mm:ss z')——注意假的UTC时区——然后减去3600x1,因为你有一个+1h的偏移量。然后from_unixtime(...)
  • 啊,印度更棘手,因为他们有这 1/2 小时的额外偏移量......

标签: datetime hadoop hive


【解决方案1】:

一种方法是,您可以编写一个 Hive UDF 进行时间格式转换。

另一种方法是,使用 unix_timestamp 将 ISO 时间戳转换为秒,然后使用 to_utc_timestamp

 TO_UTC_TIMESTAMP(UNIX_TIMESTAMP(T.date, "yyyy-MM-dd'T'hh:mm:ss.SSS'Z'") * 1000, '<timezone>')

【讨论】:

  • 而且我没有时区名称,我有偏移量,所以这对我没有帮助。 UDF 会起作用,但我肯定不是第一个提出这个要求的人......
  • Java SimpleDateFormat 定义小写字母h 来表示Hour in am/pm (1-12)。要与标准 ISO8601 格式一起使用,应使用双大写字母“HH”,它表示 Hour in day (0-23)。此外,有许多方法可以表示时区偏移量。有关示例,请参见 javadoc 网站。
猜你喜欢
  • 2021-03-05
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多