Edited at

TreasureDataでHiveクエリを書くとき - timeで範囲を指定するべし

More than 3 years have passed since last update.


はじめに

TreasureDataを利用するとお気軽にHadoopなどのBigdata環境を利用できるのですが、RDB感覚で利用できるのが良い点と言えばよい点なのですが、RDBでもいいならMySQLとかでいいよね。って話なのでやっぱり苦手なこともあります。

とりあえずRDBしか触ったことないけどTreasureDataでクエリ書こうと思っている方向けに書いてます。

注)私はTreasureDataの中の人じゃないです。あしからず。


悪い例

とりあえずRDB使っていると下のようなSQLを書きたくなりますね。でも、あなたのBigDataって、テーブルの中に何億件のデータがありますか?よく考えて!

また、TreasureDataの内部の仕組みはtime別にストレージを区切って、さらにカラムナー型(カラムごとに縦割り)で保存しています。(詳しくはPlazma - Treasure Data’s distributed analytical database -

そんなわけでとりあえずのビールじゃなくてとりあえずの「*(アスタリスク)」は絶対ダメ!


sample_datasets

select * from www_access


WS2556.JPG

↑これがログですが、よく見ると下のようなエラーがでてます。


Output

 **

** WARNING: time index filtering is not set!
** This query could be very slow as a result.
** If you used 'unix_timestmap' please modify your query to use TD_SCHEDULED_TIME instead
** or rewrite the condition using TD_TIME_RANGE
** Please see http://docs.treasure-data.com/articles/performance-tuning#leveraging-time-based-partitioning
**

翻訳します。


Output

警告:timeの指定されてないぞ!

このクエリって超遅くなる可能性があるよ。
もしも、unix_timestampってのを利用してtimeの条件を指定している気になっているなら、TD_SCHEDULED_TIME ってのがあるから書き直して。timeの範囲を指定したい場合はTD_TIME_RANGEってのがあるから使って。
てか、ドキュメントをもっかい見てね。

このクエリって超遅くなる可能性あるぞ!!

ドキュメントをもっかい見てね!


いい例

そんなわけで今回は1回目なので2点だけ


  • SELECTの後ろは必要なカラム名だけを書こう!

  • timeの条件指定を独自関数を利用してする!


sample_datasets

select time,user,host from www_access

where TD_TIME_RANGE(time,"2014-10-01","2014-10-31","JST")

WS2557.JPG

あ、エラーが出なくなった。