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
をベースに時間でパーティショニングして保存しているため、解析に用いるログデータの取得を必要な分だけに抑えられるからです。
参考: