如何在Hive中从不同时区转换时间戳

时间:2018-09-18 05:06:39

标签: hive timezone timestamp

我正在用json负载查询Hive中的表,并从这些负载中提取时间戳。问题是时间戳以不同的时区格式显示,而我试图将它们全部提取到我的时区中。

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

  

选择
  from_unixtime(unix_timestamp(get_json_object(table.payload,   '$ .timestamp'),“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”))
  从表

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

下面的宏怎么样:

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

答案 1 :(得分:-1)

在不使用正则表达式的情况下,将+1000的Z用作Z +10:00:

select unix_timestamp('2016-07-30T10:29:33.000+03:00', "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") as t1
select unix_timestamp('2016-07-30T10:29:33.000+0300', "yyyy-MM-dd'T'HH:mm:ss.SSSZ") as t2

有关时间格式的完整文档: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html