4 Treasure Data の扱い方

Treasure Data (以下, TD) はコンソール上で Hive と Presto という2種類のSQLエンジンのバリエーションを扱うことができるソフトウェアです. 前者は分散処理システム Apache Hadoop をベースにしたデータウェアハウス環境11で (Hive のサポートするSQL風のデータベース言語を HiveQL と呼びます), Presto は大規模データを対象とした SQL エンジンです. つまりどちらも大規模データを想定したものですが, Presto は中間データをストレージに書き込まずにメモリで保持するため高速です. つまり, メモリで扱える範囲であれば Presto, そうでなければ Hive というのが典型的な使い分けになります. また, 両者はそれぞれ少しづつ言語仕様が異なるので注意が必要です.

ブラウザでTDコンソールを開き, 以下のようなクエリを実行してみます12. エンジンは Presto を選択してください.

一般公開版では, 以降のクエリは一部伏せられています.

SELECT COUNT(1) AS count
FROM <HOGEHOGEDB>.<HOGEHOGETABLE>
WHERE TD_TIME_RANGE(time, '2020-06-01', '2020-06-02', 'JST')

同じクエリを, 今度は Hive に切り替えて実行してみてください. Presto が数秒で終わるのに対し, Hive は数分かかるはずです. どちらのケースでも, 大容量のデータを処理するための効率的な書き方があります. 最も基本的なことは, 不要なデータを読み込まないことです. TDのテーブルには常に time というタイムスタンプに連動したインデックスが存在し, 普通はこれで取得する範囲を制限します. WHERE TD_TIME_RANGE('...') がそれに相当します.

この time 列はUNIX時間で表現されています. 日付に変換したい場合は TD_TIME_FORMAT() を使います.

時刻フォーマットは ISO 8601 とは微妙に異なり, 大文字小文字で意味が変わる点に注意してください. 確認のため, 以下のように取得期間内の最初と最後のレコード時刻, そしてUNIX時間のゼロ秒を表示してみます.

SELECT TD_TIME_FORMAT(MAX(time), 'yyyy-MM-dd HH:mm:ss', 'JST') AS max_dt,
TD_TIME_FORMAT(MIN(time), 'yyyy-MM-dd HH:mm:ss', 'JST') AS min_dt,
TD_TIME_FORMAT(0, 'yyyy-MM-dd HH:mm:ss', 'JST') AS unix_zero
FROM <HOGEHOGEDB>.<HOGEHOGETABLE>
WHERE TD_TIME_RANGE(time, '2020-06-01', '2020-06-02', 'JST')

さてここで, max_dt2020-06-01 23:59:59 となっていると思います. TD_TIME_RANGE() は, 第3引数の時刻を含みません. これは後で説明する Python の pandas モジュールとは異なる仕様なので混同しないよう注意してください.

今回は Python 経由でクエリを実行することが多いため, より複雑なクエリについては次のセクションで解説します.

TD クエリのより詳しい説明は公式ドキュメントを参照してください. 特に, 効率的なクエリを書くヒントが書かれた SQL and Performance Tuning Tips などが有用です.


  1. Hive にはさらに Hive を利用した機械学習エンジン Hivemall が用意されており, HiveQL で書くことができますが, 機械学習業務での使い勝手と実装されているアルゴリズムの少なさから, 今回は使う必要はあまりないためここでは説明しません.↩︎

  2. 本稿ではSQLの予約語や関数名を全て大文字で書く, というコーディングルールを課していますが, 小文字でも構いません.↩︎