Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
38
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

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

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

参考:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
38
Help us understand the problem. What are the problem?