【问题标题】:How to convert Java timestamp stored as bigint to timestamp in Presto?如何将存储为 bigint 的 Java 时间戳转换为 Presto 中的时间戳?
【发布时间】:2017-11-15 22:34:28
【问题描述】:

这几天我没能找到这个。

如果我的配置单元表中数据的 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)。

【问题讨论】:

    标签: presto


    【解决方案1】:

    我没有找到从 Java 时间戳(自 1970 年以来的毫秒数)到时间戳的直接转换,但可以使用 to_unixtime 并添加毫秒作为间隔来完成:

    presto> with t as (select cast('1497435766032' as bigint) a)
         -> select from_unixtime(a / 1000) + parse_duration(cast((a % 1000) as varchar) || 'ms') from t;
              _col0          
    -------------------------
     2017-06-14 12:22:46.032 
    (1 row)
    

    (虽然很麻烦,但很有效)

    【讨论】:

      【解决方案2】:

      select from_unixtime(cast(event_time as bigint) / 1000000) + parse_duration(cast((cast(event_time as bigint) % 1000) as varchar) || 'ms') from TableName limit 10;

      【讨论】:

      • 谢谢,但我想我不明白这是做什么的。看起来您可能是以秒为单位的时间,然后添加毫秒的余数。但是现在我很困惑为什么第一个除数还是1000多个。
      猜你喜欢
      • 2018-10-07
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      相关资源
      最近更新 更多