6

ドキュメントによると、タイムスタンプは次の変換をサポートしています。

•浮動小数点数値型: 10 進精度の秒単位の UNIX タイムスタンプとして解釈されます。

まず、これをどう解釈していいのかわかりません。タイムスタンプが 2013-01-01 12:00:00.423 の場合、これをミリ秒を保持する数値型に変換できますか? それが私が欲しいものだからです。

より一般的には、次のようなタイムスタンプ間の比較を行う必要があります

select maxts - mints as latency from mytable

ここで、maxtsmintsはタイムスタンプ列です。現在、これにより、NullPointerExceptionHive 0.11.0 を使用できます。次のようなことをすると、クエリを実行できます

select unix_timestamp(maxts) - unix_timestamp(mints) as latency from mytable

ただし、これはミリ秒の精度ではなく、秒単位でのみ機能します。

どんな助けでも感謝します。追加情報が必要な場合は教えてください。

4

1 に答える 1

12

ミリ秒で作業したい場合は、日付をエポックからの秒数と見なすため、UNIX タイムスタンプ関数を使用しないでください。

hive> describe function extended unix_timestamp;
unix_timestamp([date[, pattern]]) - Returns the UNIX timestamp
Converts the current or specified time to number of seconds since 1970-01-01.

代わりに、 JDBC 準拠のタイムスタンプを doubleに変換してください。
例えば:

タブ区切りのデータが与えられた場合:

cat /user/hive/ts/data.txt :
a   2013-01-01 12:00:00.423   2013-01-01 12:00:00.433
b   2013-01-01 12:00:00.423   2013-01-01 12:00:00.733

CREATE EXTERNAL TABLE ts (txt string, st Timestamp, et Timestamp) 
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '/user/hive/ts';

次に、次のように、ミリ秒単位で startTime(st) と endTime(et) の差を照会できます。

select 
  txt, 
  cast(
    round(
      cast((e-s) as double) * 1000
    ) as int
  ) latency 
from (select txt, cast(st as double) s, cast(et as double) e from ts) q;
于 2013-09-11T22:59:32.243 に答える