読者です 読者をやめる 読者になる 読者になる

ログってなんぼ

日々のメモです

TreasureData:TD_TIME_RANGE()の引数は明示しないとクエリの最適化がされない

docs.treasuredata.com

このへん見ながら色々と試行錯誤してたけどちょっと疑問があったのでサポートを利用させて頂き質問を投げました。 結論から言うと現段階では仕様、とのことでしたので備忘録としてメモ。

2億件ちょっとのテーブルに対して

昨日一日分のデータがサマリで欲しいな!

SELECT
    v[ 'hoge' ]
    ,COUNT( 1 ) AS cnt
  FROM
   acceslog
  WHERE
    TD_TIME_RANGE (
      TIME
      ,'2013-12-05 00:00:00'
      ,'2013-12-05 23:59:59'
      ,'JST'
    )
  GROUP BY
    v[ 'hoge' ] CLUSTER BY cnt
Hive history file=/mnt/hive/tmp/2957/hive_job_log__964228348.txt
**
** Time indices:
**    Time index: [2013-12-04 15:00:00 +0000, 2013-12-05 14:59:58 +0000)
**

MapReduce time taken: 89.215 seconds

まあ簡単なクエリなんでちゃんと取得出来ました。データが多くても範囲指定できるから安心してクエリ投げれますね!100億件くらい入れたい。

じゃ、コレを毎日回すVerに改造

昨日の00:00:00から昨日の23:59:59まで。

SELECT
    v[ 'hoge' ]
    ,COUNT( 1 ) AS cnt
  FROM
   acceslog
  WHERE
       TD_TIME_RANGE(
            time,
         TD_TIME_FORMAT(
              TD_TIME_ADD(unix_timestamp(), '-1d'),
              'yyyy-MM-dd 00:00:00'
         ),
         TD_TIME_FORMAT(
              TD_TIME_ADD(unix_timestamp(), '-1d'),
              'yyyy-MM-dd 23:59:59'
         ),
         'JST'
    )
  GROUP BY
    v[ 'hoge' ] CLUSTER BY cnt

実行

started at 2013-12-06T01:29:42Z
Hive history file=/mnt/hive/tmp/2957/hive_job_log__1366751613.txt
**
** WARNING: time index filtering is not set!
** This query could be very slow as a result.
** Please see http://docs.treasure-data.com/articles/performance-tuning#leveraging-time-based-partitioning
**

あら?タイムレンジでフィルタ出来てないのでクエリが遅くなりますよ~のwarningが・・・

実際クエリもめちゃ遅い・・・どのくらい遅いかというと多分コレ数十分オーダーで時間かかりそうなくらい遅い。

というわけでサポートに聞いてみた

詳細は避け&サポートからの返答をコピペするのはやめときますが、 Hive標準関数のunix_timestamp()が実行されるタイミングとUDFであるTD_TIME_RANGE()が動くタイミングの関係で、最終的なクエリが最適化されないらしい。現在この挙動は仕様とのこと。

というわけでしばらくは日付部分を明示するようなスクリプトを書いてこちらのサーバーからAPIを叩くしかないようですね。 トレジャーデータさんのダッシュボードが結構高機能なので、ここだけで完結できたらいいなと思いますが今後に期待と。