2017-06-14 10 views
2

私はこれを数日かけて少し調べてみました。ハイブテーブル内のデータのための私のアブロスキーマがある場合Prestoでbigintとして保存されたJavaタイムスタンプをタイムスタンプに変換する方法は?

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

と、私はこれを照会するプレストを使用し、私はフォーマットされたタイムスタンプを得ることはありません。

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 

また、彼らはいつもソースが秒であると仮定するプレストのタイムスタンプ鋳造を変更しました。 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サーバーとHiveサーバーを再起動してタイムゾーンをUTCに強制的に変更することはできません)。

答えて

2

私は、タイムスタンプへの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) 

(確かに面倒な、しかし作品)

関連する問題