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,
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
TD_TIME_FORMAT(FROM <HOGEHOGEDB>.<HOGEHOGETABLE>
WHERE TD_TIME_RANGE(time, '2020-06-01', '2020-06-02', 'JST')
さてここで, max_dt
が 2020-06-01 23:59:59
となっていると思います. TD_TIME_RANGE()
は, 第3引数の時刻を含みません. これは後で説明する Python の pandas
モジュールとは異なる仕様なので混同しないよう注意してください.
今回は Python 経由でクエリを実行することが多いため, より複雑なクエリについては次のセクションで解説します.
TD クエリのより詳しい説明は公式ドキュメントを参照してください. 特に, 効率的なクエリを書くヒントが書かれた SQL and Performance Tuning Tips などが有用です.