LoginSignup
38
36

More than 5 years have passed since last update.

Treasure Data で "昨日1日分" の集計をする

Last updated at Posted at 2013-05-15

TD_TIME_RANGE() を使えば、前日分を簡単に集計できます。

TD_TIME_RANGE とは

TD で定義されている hive の UDF です。

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

TD_TIME_RANGE() には、対象の schema, start, end を指定します。
対象の schema には、 td がログに入れた時間を保持している time schema を、start と end には、その日の最初の時間と最後の時間を指定します。ちなみに start と end は (start_time <= time && time < end_time) と展開されるため、end_time は含みません。

「前日1日分の集計」

というわけで、前日の 00:00:00 から 当日の 00:00:00 までを集計するには、以下のような条件を WHERE 句に追加します。

TD_TIME_RANGE(time,
    TD_TIME_FORMAT(TD_TIME_ADD(unix_timestamp(), '-1d'), 'yyyy-MM-dd 00:00:00', 'JST'),
    TD_TIME_FORMAT(unix_timestamp(), 'yyyy-MM-dd 00:00:00', 'JST'),
    'JST'
)

これを用いると、例えば、昨日一日のPV などは、以下の様に取得できます。

SELECT
    count(*)
FROM
    access_log
WHERE
    TD_TIME_RANGE(
        time,
        TD_TIME_FORMAT(TD_TIME_ADD(unix_timestamp(), '-1d'), 'yyyy-MM-dd 00:00:00', 'JST'),
        TD_TIME_FORMAT(unix_timestamp(), 'yyyy-MM-dd 00:00:00', 'JST'),
        'JST'
    )

td scheds を使ってスケジュール登録して日次で PV 集計を行う場合 unix_timestamp()TD_SCHEDULED_TIME() にするだけですね。

備考

ちなみに time に対して TD_TIME_RANGE() 関数を使うと、td の実行速度が速くなるというメリットがあります。Treasure Data は upload されてきたログデータを、time をベースに時間でパーティショニングして保存しているため、解析に用いるログデータの取得を必要な分だけに抑えられるからです。

参考:

38
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
36