如何将存储为bigint的Java时间戳转换为Presto中的时间戳?

时间:2017-06-14 00:23:06

标签: presto

我几天没有运气寻找这个。

如果我在hive表中的数据的avro架构是:

{
  "type" : "record",
  "name" : "messages",
  "namespace" : "com.company.messages",
  "fields" : [ {
    "name" : "timeStamp",
    "type" : "long",
    "logicalType" : "timestamp-millis"
  }, {
  …

我使用presto来查询这个,我没有得到格式化的时间戳。

select "timestamp", typeof("timestamp") as type,
current_timestamp as "current_timestamp", typeof(current_timestamp) as current_type
from db.messages limit 1
timestamp     type   current_timestamp                  current_type
1497210701839 bigint 2017-06-14 09:32:43.098 Asia/Seoul timestamp with time zone

我认为将它们转换为精确到毫秒级的时间戳是没有问题的,但我发现我没有明确的方法来做到这一点。

select cast("timestamp" as timestamp) from db.messages limit 1
line 1:16: Cannot cast bigint to timestamp

他们也改变了presto的时间戳,以便总是假设源是在几秒钟内。 https://issues.apache.org/jira/browse/HIVE-3454

所以,如果我使用from_unixtime(),我必须砍掉毫秒,否则它会给我一个非常遥远的日期:

select from_unixtime("timestamp") as "timestamp" from db.messages limit 1
timestamp  
+49414-08-06 07:15:35.000

当然,与Presto合作的其他人更经常知道如何恰当地表达转换。 (我无法重启Presto或Hive服务器以强制将时区转换为UTC btw)。

2 个答案:

答案 0 :(得分:3)

我没有找到从Java时间戳(自1970年以来的毫秒数)到时间戳的直接转换,但可以使用select col1, sum(cast(replace(col2, 'aa', '') as number) from tablea a group by col1; 完成,并将间隔加上毫秒:

to_unixtime

(诚然很麻烦,但有效)

答案 1 :(得分:2)

从tableName limit 10中选择from_unixtime(cast(event_time as bigint)/ 1000000)+ parse_duration(cast((cast(event_time as bigint)%1000)as varchar)||'ms');