Hive 如何在配置单元中转换来自不同时区的时间戳

Hive 如何在配置单元中转换来自不同时区的时间戳,hive,timezone,timestamp,Hive,Timezone,Timestamp,我正在用json有效载荷查询配置单元中的一个表,并从这些有效载荷中提取时间戳。问题是时间戳存在于不同的时区格式中,我试图在我的时区中提取它们 我目前正在使用以下工具: 挑选 从_unixtimeunix_timestampget_json_object table.payload, “$.timestamp”,yyyy-MM-dd'T'HH:MM:ss.SSSXXX 从桌子上 如果时间戳采用以下格式,则返回正确的值:2018-08-16T08:54:05.543Z->2018-08-16 18:

我正在用json有效载荷查询配置单元中的一个表,并从这些有效载荷中提取时间戳。问题是时间戳存在于不同的时区格式中,我试图在我的时区中提取它们

我目前正在使用以下工具:

挑选 从_unixtimeunix_timestampget_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已更改格式并转换为我的时区

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

我如何调整我的查询以适用于所有类型的时间戳所有转换到正确时区+10是我的时区!所有的格式都一样吗


提前谢谢

下面的宏如何:

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));
e、 g


如果没有regexp,则在+10:00时使用Z表示XXX的+1000:

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
关于时间格式的完整文档:

当逻辑与正则表达式匹配/替换时,您需要一个非常复杂的案例来处理大多数格式,而不是期望处理所有格式-您需要有关区域设置的信息来匹配DEC/DEZ或01/02,从1月2日到2月1日。如果您不能开发Java UDF,请创建一个临时宏。不处理以“+1000”或“Z”或“UTC”表示的时区。通过case-when添加额外的解析器并不困难,我只需要完整的时间戳格式列表。
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