web-dev-qa-db-ja.com

ハイブでの現地時間のUTC時間への変換

インターネットでよく検索しましたが、答えが見つかりませんでした。ここに私の質問があります:

私はHiveでいくつかのクエリを書いています。 UTCタイムスタンプがあり、UTC時間に変更したい、たとえば、タイムスタンプ1349049600が与えられた場合、2012-10-01 00:00:00のUTC時間に変換したいただし、Hiveで組み込み関数from_unixtime(1349049600)を使用すると、ローカルPDT時間2012-09-30 17:00:00が取得されます。

from_utc_timestamp(timestamp, string timezone)という組み込み関数があることに気付きました。それからfrom_utc_timestamp(1349049600, "GMT")のように試してみましたが、出力は1970-01-16 06:44:09.6で、これはまったく間違っています。

他のユーザーがいるため、Hiveのタイムゾーンを永続的に変更したくありません。 1349049600から「2012-10-01 00:00:00」までのUTCタイムスタンプ文字列を取得する方法はありますか?どうもありがとう!!

13
Iam619

私が知る限り、from_utc_timestamp()には、"2014-01-15 11:21:15"のような日付文字列引数が必要であり、EpochからのUNIX秒値ではありません。それが整数を渡すときに奇妙な結果を与えている理由でしょうか?

エポック秒を処理する唯一のHive関数はfrom_unixtime()のようで、server timezoneのタイムスタンプ文字列を提供します。これは/etc/sysconfig/clock-"America/Montreal"私の場合。

したがって、to_utc_timestamp(from_unixtime(1389802875),'America/Montreal')を介してUTCタイムスタンプ文字列を取得し、from_utc_timestamp()を使用してターゲットタイムゾーンに変換できます。

特に、サーバーTZをSQLに配線する必要があるため、すべてが非常に困難に思われます。 from_unixtime_utc()関数または何かがあれば人生は楽になります。


更新from_utc_timestamp()は、文字列だけでなくmilliseconds引数も処理しますが、変換が正しく行われません。

from_utc_timestamp(1389802875000, 'America/Los_Angeles')を試すと、"2014-01-15 03:21:15"が返されますが、これは間違っています。
正解は"2014-01-15 08:21:15"で、from_utc_timestamp(to_utc_timestamp(from_unixtime(1389802875),'America/Montreal'), 'America/Los_Angeles')を介して取得できます(モントリオールのサーバーの場合)。

15
patricksurry

ちょっとここに追加したかったので、システムのタイムゾーンを「自動化」することをお勧めします。静的にではなく

#STATIC TZ deceleration     
to_utc_timestamp(from_unixtime(1389802875),'America/Montreal')

これを試して

#DYNAMIC TZ
select to_utc_timestamp(from_unixtime(1389802875), from_unixtime(unix_timestamp(), "z"));

これは、文字列出力形式「from_unixtime "タイムゾーン文字列を返す(小文字のz)

5
dedricF

次のように使用します。

to_utc_timestamp(from_unixtime(timestamp),"PDT")

3
Akshat Singhal

この例では、HiveコードにシステムタイムゾーンTZの値が固定されているという問題の解決策を示します。これは、OpenJDK Javaバージョン1.6で、Centos環境でHive 0.10.0を使用して実行されました。時間操作を伴うため、これらの正確なソフトウェアリビジョンが重要になる場合があります。 tblFiniteZahlはDUALに似ていますが、約100万行の有限数を推測しますが、少なくとも1行で任意のテーブルを置き換えることができます。トリックは、ローカルタイムゾーンで時刻をフォーマットしますが、タイムゾーンをキャプチャしてから、実行時にto_utc_timestamp関数に渡すためにその値を抽出します。

select D1,
       D1E,
       D1L,
       D1LT,
       D1LZ,
       to_utc_timestamp(D1LT, D1LZ) as D1UTC
from (
select D1,
       D1E,
       D1L,
       regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 1) as D1LT,
       regexp_extract(D1L, '^([^ ]+[ ][^ ]+)[ ](.+)$', 2) as D1LZ
from (
select D1,
       D1E,
       from_unixtime(D1E, 'yyyy-MM-dd HH:mm:ss z') as D1L
from (
select D1,
       unix_timestamp(D1,'yyyy-MM-dd HH:mm:ss Z') as D1E
from (
select '2015-08-24 01:15:23 UTC' as D1
from tblFiniteZahl
limit 1
      ) T1
      ) T2
      ) T3
      ) T4
;

結果は

D1 = 2015-08-24 01:15:23 UTC
DT3 = 1440378923
D1L = 2015-08-23 21:15:23 EDT
D1LT = 2015-08-23 21:15:23
D1LZ = EDT
D1UTC = 2015-08-23 21:15:23

これは、to_utc_timestampがEDTの2番目の引数を取ることを示しています。

1
George Carrette