Treasure Data内のデータの出力

こんにちは、SSTDの大村です。皆様、ゴールデンウィークはいかがでしたでしょうか?私はひざが痛かったので整体に久しぶりに行ったら「痩せないと治らないよ!」と言われてしまい、人生初の美容目的以外のダイエット中です。近所のスイミングクラブに入会しようかどうか悩んでいます。

我が家の花壇は花満開です。

本題に移る前に宣伝ですが、弊社では来たる5/17(金)にトレジャーデータ社との共催で、無料セミナー『Treasure Dataが拡げるBIGDATA最新動向』を開催させていただくこととなりました。本セミナーでは、「Treasure Data Service」を利用した今後のビッグデータ活用の参考として頂ける先進事例や、トレジャーデータ社の芳川CEOによるビジョンと戦略に関する講演、Treasure Data 利用方法のデモなど、最新情報について紹介させていただきます。 実は。。。私がデモをさせていただく予定なんです(汗汗)。まだ、席がありますのでよろしかったらいらしてください。

さて、前回はTreasure Dataにデータをアップロードしました。Treasure Dataはたくさんのデータをためておくことができる倉庫としても利用できるのですが、Treasure Dataは内部のデータを分析することもできますし、別の場所に出力することもできます。今回はTreasure Dataにアップロードしたデータを利用する方法を紹介したいと思います。

データを参照する

テーブルの一覧やデータ数を確認

テーブルのデータ数を参照するにはこれまでも利用してきましたtd tableコマンドを利用します。

$ td table:list {DB名}

DB名を記述すれば、特定のDB内のテーブル一覧、指定しなければ全テーブルの一覧が表示されます。

クエリを利用する

以前、紹介しましたようにTreasure Dataは通常のデータベースのようにSQLを利用して内容を確認することができます。正しくはHiveQL(はいぶきゅーえる)と呼ばれるHiveの操作を行うためのSQLのようなものですが、HiveQLとTreasure Dataで利用できるHiveQLについては後の記事で紹介予定です。

$ td query -d example_db -w "select count(*) from table1"
$ td query -d example_db -w -q query.txt

ここまでは前回までに紹介しましたが、結果は標準出力に表示して確認していただけでした。標準出力以外の場所にデータを出力する方法の一部を紹介します。

Treasure Dataの別テーブルに書き込む

まず、アップロードされたデータの一部を別のテーブルに書き込む方法を紹介します。

$ td query --result 'td://@/testdb/output_table' -w -d testdb "SELECT v['code'] as code, COUNT(1) as cnt FROM www_access GROUP BY v['code']"

--resultオプションで書き込み先の指定を追加するだけです。'td://@/{データベース名}/{テーブル名}'と指定します。存在しないテーブルを指定すると自動で作成されます

Status : success
Result :
+-----+------+
| code | cnt |
+-----+------+
| 404 | 17 |
| 500 | 2 |
| 200 | 4981 |
+-----+------+
3 rows in set

$ td table:list
+----------+--------------+------+-----------+---------+---------------------------+--------+
| Database | Table | Type | Count | Size | Last import | Schema |
+----------+--------------+------+-----------+---------+---------------------------+--------+
| testdb | accesslog | log | 5 | 0.0 GB | 2013-04-25 17:23:08 +0900 | |
| testdb | output_table | log | 3 | 0.0 GB | | |
| testdb | www_access | log | 5,000 | 0.0 GB | 2013-04-16 17:42:00 +0900 | |
+----------+--------------+------+-----------+---------+---------------------------+--------+
3 rows in set

確認のためデータを見ましょう。最初は最近入力したデータを見るtable:tailコマンドを利用してみます。

$ td table:tail testdb output_table
{"cnt":17,"time":1367917828,"code":"404"}
{"cnt":2,"time":1367917828,"code":"500"}
{"cnt":4981,"time":1367917828,"code":"200"}

次にクエリでテーブルに入っている全件データを参照してみましょう。

$ td query -w -d testdb "select * from output_table"
(中略)
Status : success
Result :
+-------------------------------------------------+------------+
| v | time |
+-------------------------------------------------+------------+
| {"cnt":"17","time":"1367917828","code":"404"} | 1367917828 |
| {"cnt":"2","time":"1367917828","code":"500"} | 1367917828 |
| {"cnt":"4981","time":"1367917828","code":"200"} | 1367917828 |
+-------------------------------------------------+------------+
3 rows in set

データをファイルに出力する

最後にクエリの実行結果をファイルに出力します。ファイルに出力する場合は-fで出力形式、-oで出力ファイルのパスを指定します。

$ td query -w -d testdb -f csv -o output.csv "select * from output_table"
(中略)
OK
MapReduce time taken: 0.276 seconds
Time taken: 1.905 seconds
Status : success
Result :
written to output.csv in csv format

作成されたファイルの中身を見てみましょう。

$ cat output.csv
"{""cnt"":""17"",""time"":""1367917828"",""code"":""404""}",1367917828
"{""cnt"":""2"",""time"":""1367917828"",""code"":""500""}",1367917828
"{""cnt"":""4981"",""time"":""1367917828"",""code"":""200""}",1367917828

見づらいですね。そして、CSVで開くと2列のデータになり利用しづらいです。そこで、カラム名をきちんとつけて出力してみます。

$ td query -w -d testdb -f csv -o output2.csv "select v['code'] as code,v['cnt'] as count,time from output_table"
(中略)
OK
MapReduce time taken: 16.541 seconds
Time taken: 16.809 seconds
Status : success
Result :
written to output2.csv in csv format

作成されたファイルの中身を見てみましょう。

$ cat output2.csv
404,17,1367917828
500,2,1367917828
200,4981,1367917828

利用しやすい形で出力することができました。

このようにTreasure Dataから必要な一部分を他のテーブルに書き込んだり、ファイルに出力したりすることが簡単にできます。 ファイルに限らず外部データベースなどに書き込む方法もありますので、別の回で紹介しますね。

執筆:大村@SSTD