でHiveクエリを書くとき - 独自関数TD_TIME_RANGE利用しよう


はじめに

TreasureDataに貯めたデータを取得するためにHiveが利用できるのですが、HiveはHadoopのために作られたものですので、Hadoopを改良したTreasureDataを利用する上で不足している機能もあります。それを補うためにTreasureDataは独自関数を提供しています。

ドキュメント:Supported Hive UDFs

上記のドキュメントを見ればいいんですが、そうは言ってもどうやって使うのよ?って思っていらっしゃる皆様のために1つずつ使い方を説明しましょう。今回は一番使うというか、毎回必ず使ってください!というTD_TIME_RANGEについて紹介します。

TD_TIME_RANGEとは

前の記事でも紹介しましたが、TreasureDataはデータをtimeカラムに指定してある時間に対して、1時間単位で保存領域を分けて保存しています。そこで、データを取ってくる時間の範囲を指定すればその時間の範囲のみの保存領域にアクセスを行うので、高速にクエリを実行することができます。逆に時間範囲を指定しないとデータが保存してあるすべての領域のデータにアクセスることになりますのでとーーーーても遅くなります。

時間の範囲はint型のunixtimeで指定してもいいのですが、毎回変換するのも面倒くさいですし、パッと見たときにわかりづらいです。そこで、簡単に時間の範囲を指定できるようにTD_TIME_RANGEを用意しています。

使い方

しつこいですが、ドキュメントを見ましょう。使い方書いてある!

Signature
boolean TD_TIME_RANGE(int/long unix_timestamp,
                      int/long/string start_time,
                      int/long/string end_time
                      [, string default_timezone = 'UTC'])

利用例

2015/01/01 00:00:00<= time < 2015/02/01 00:00:00(日本時間)を指定していますので、2015年1月のデータを取得できます。第1引数はtimeカラム、第二引数は開始時間、第3引数は終了時間、第4引数はタイムゾーンを指定します。日本時間は'JST'と書きます。

select ... where TD_TIME_RANGE(time,'2015-01-01','2015-02-01','JST')

基準時間が00:00:00の場合は省略しても構いませんが、それ以外の時間の範囲を調べたい場合は時間まで指定しましょう。

select ... where TD_TIME_RANGE(time,'2015-01-01 07:00:00','2015-01-01 19:00:00','JST')

開始時間、終了時間が最初から、最後までの場合はNULLを指定できます。

select ... where TD_TIME_RANGE(time,NULL,'2015-02-01','JST')
select ... where TD_TIME_RANGE(time,'2015-01-01',NULL,'JST')

まとめ

クエリが遅いとお悩みのあなたは時間を指定できないかもう一度考えてみましょう。過去のデータは変更されない場合などは1日分ずつの集計結果を他のテーブルに毎日書き込んでおけば、毎回1日分の集計をするだけで済みますよね。