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