首页 > 解决方案 > 如何在 Hive 中转换不同时区的时间戳

问题描述

我正在使用 json 有效负载查询 Hive 中的表,并从这些有效负载中提取时间戳。问题是时间戳以不同的时区格式存在,我试图在我的时区中提取它们。

我目前正在使用以下内容:

select
from_unixtime(unix_timestamp(get_json_object (table.payload, '$.timestamp'), "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"))
FROM table

如果时间戳采用以下格式,则返回正确的值:2018-08-16T08:54:05.543Z --> 2018-08-16 18:54:05(更改格式并转换为我的时区)

但是,如果有效负载包含以下格式的时间戳,则上述查询返回“null”:2018-09-13T01:35:08.460+0000 2018-09-13T11:35:09+10:00

如何调整我的查询以适用于所有类型的时间戳都转换为正确的时区(+10 是我的时区!)并且都采用相同的格式?

提前致谢!

标签: hivetimezonetimestamp

解决方案


下面的宏怎么样:

create temporary macro extract_ts(ts string) 
  from_unixtime(unix_timestamp(regexp_extract(ts, '(.*)\\+(.*)', 1), "yyyy-MM-dd'T'HH:mm:ss") + 3600*cast(regexp_extract(ts, '(.*)\\+(.*)\\:(.*)', 2) as int));

例如,

hive> select extract_ts('2018-09-13T11:35:09+10:00');
OK
2018-09-13 21:35:09

推荐阅读