hive - 如何在 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 是我的时区!)并且都采用相同的格式?
提前致谢!
解决方案
下面的宏怎么样:
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
推荐阅读
- sql - 如何使用 Doctrine QueryBuilder 删除多个实体
- c - 为什么使用 long as 数据类型会使“隐式转换失去整数精度”消失?
- python - python打开浏览器并获取html
- node.js - Couchdb 视图按行返回行
- javascript - App Inventor WebViewer 缩小尺寸
- php - Laravel Eloquent Relation Query - 获取数据以及关系属性
- node.js - Nodemailer /send 给出 404 错误
- c++ - 在运行时生成可变参数列表
- typescript - 在 ngx-leaflet 中动态处理折线
- java - 向枚举字段添加其他信息