この例では、Hive コードにシステム タイム ゾーン TZ の値が組み込まれているという問題の解決策を示します。OpenJDK Java バージョン 1.6 を使用して、Centos 環境でハイブ 0.10.0 を使用して実行されました。時間を操作する必要があるため、正確なソフトウェア リビジョンが重要になる場合があります。現在、システムは EDT で動作しています。テーブル tblFiniteZahl は DUAL に似ていますが、ご想像のとおり、約 100 万行の有限数です。ただし、少なくとも 1 行を含む任意のテーブルを置き換えることができます。トリックは、時刻をローカル タイムゾーンでフォーマットすることですが、z 形式を使用してタイムゾーンをキャプチャし、実行時にその値を抽出して 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 番目の引数を取ることを示しています。