我正在用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是我的时区!)并且格式相同?
谢谢!
答案 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