でHiveクエリを書くとき - TD_TIME_FORMAT,TD_TIME_PARSE,TD_DATE_TRUNC


はじめに

Treasure DataはHiveの関数以外に独自関数を。。。(略

ドキュメント:Supported Hive UDFs

ドキュメントを見れば、ここから下は不要だ。

TD_TIME_FORMAT

Treasure Dataのtimeカラムはunixtime型なので人間がわかる形に変換したい。変換するのにHiveの昔のバージョンですと変換関数でタイムゾーンを指定できなかったので独自関数として用意されたようです。

Signature
string TD_TIME_FORMAT(long unix_timestamp,
                      string format
                      [, string timezone = 'UTC'])

第二引数に指定されたフォーマットに変換されます。詳しくはこちら

第三引数はタイムゾーンを指定します。日本時間は"JST"と書きます。

利用例

TD_TIME_FORMAT(time,'yyyy-MM-dd HH:mm:ss z','JST')
-> 2014-10-04 09:24:52 GMT+09:00
TD_TIME_FORMAT(time,'MMMM d yyyy EEEE','JST')
-> October 4 2014 Saturday

TD_TIME_PARSE

TD_TIME_FORMATの逆で、文字列→unixtimeに変換してくれます。変換するのに昔の...(略)

Signature
long TD_TIME_PARSE(string time
                   [, string default_timezone = 'UTC'])

利用例

TD_TIME_PARSE('2015-01-01','JST')
-> 1420038000
TD_TIME_PARSE('2015-01-01 15:25:26','JST')
-> 1420093526

TD_DATE_TRUNC

期間を指定するときなどにその時刻を含むキリの良い時間を指定できる関数です。TD_TIME_FORMATを利用して下のように書いてもいいんですが、カッコ悪い。(以前はTD_TIME_PARSEの中でTD_TIME_FORMATを利用すると内部的にindexがいい感じになってなかったとか。。なんとか。)

TD_TIME_PARSE(TD_TIME_FORMAT(time,'yyyy-MM-dd HH:00:00','JST'),'JST')

そこでTD_DATE_TRUNCをりようして、キリのいい時間を取得します。

Signature
long TD_DATE_TRUNC(string unit,
                   long time
                   [, string default_timezone = 'UTC'])

第一引数に指定できるのは下記です。
- 'minute'
- 'hour'
- 'day'
- 'week'
- 'month'
- 'quarter'
- 'year'

利用例

'2015-01-01 15:25:26 JST'のunixtimeは1420093526ですが、hourを指定すると'2015-01-01 15:00:00 JST'に対応した時間を返してくれます。

TD_DATE_TRUNC('hour', 1420093526, 'JST')
-> 1420092000

すっきりかけましたね。

まとめ

今回の3つの関数はよく使うので、タイムゾーンの設定を忘れないようね。