15

私はインターネットでたくさん検索しましたが、答えを見つけることができませんでした。これが私の質問です:

私はHiveでいくつかのクエリを書いています。UTC タイムスタンプがあり、それを 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 タイムスタンプ文字列を取得する方法はありますか? どうもありがとう!!

4

5 に答える 5

1

この例では、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 番目の引数を取ることを示しています。

于 2015-08-25T19:00:47.950 に答える
-2

currentmillis.com にアクセスして、実際には数秒であることを知らずに1349049600を貼り付けました。実際、日付に 1970-01-16 が返されました。これは、あなたが提案した関数 from_utc_timestamp が実際にミリ秒を最初のパラメーターとして取ることを意味しますか? 多分あなたはもう一度試すことができますfrom_utc_timestamp(1349049600000, "GMT")か?

于 2013-08-17T12:21:26.903 に答える