Apache Drillについては以下の記事が詳しいです。
抜粋:
Apache Drill は Google Dremel に触発されて開発されたオープンソースプロジェクトで、2012年8月に Apache Incubator として提案されました。大規模データに対し、バッチ処理ではなく、インタラクティブなクエリの実行を可能にするという意味では、ImpalaやStinger、Presto といったプロジェクトと同様の大きな目的を持っていますが、SQL 2003 完全準拠、パーサや処理実行部分を Pluggable にして幅広いクエリ言語やデータソースに対応、JSON/Avro のようなネストデータに対応、スキーマはオプショナルでスキーマレスなデータに対応、といったところなど、より柔軟で拡張性の高いフレームワークを目指しているのが他のプロジェクトとの違いです。
今回はMac上でJSONデータに対してクエリしてみたいと思います。
環境
- OS X Yosemite 10.10.5
- Homebrew 0.9.5
- Apache Drill 1.1.0
インストール
Homebrewからインストールできる。
$ brew install apache-drill
テスト用JSONデータの準備
Mockarooからテスト用のJSONデータを作成する。
Drillの動作確認のために改行で句切られたJSONと正規のJSON配列の2パターンを用意する。
リンク先の下部にある設定を以下に変更してDownload Data
からダウンロード。
/tmp/MOCK_DATA.jsonとして保存。
- Rows: 1000
- Format: JSON
- array: チェックを外す
{"id":1,"first_name":"Jean","last_name":"Long","email":"jlong0@hibu.com","country":"Pakistan","ip_address":"3.135.244.41"}
{"id":2,"first_name":"Denise","last_name":"Alvarez","email":"dalvarez1@wordpress.com","country":"Portugal","ip_address":"106.225.215.65"}
{"id":3,"first_name":"David","last_name":"Hudson","email":"dhudson2@blogger.com","country":"China","ip_address":"216.219.240.216"}
{"id":4,"first_name":"Douglas","last_name":"Martin","email":"dmartin3@yelp.com","country":"Brazil","ip_address":"152.165.33.178"}
{"id":5,"first_name":"Jeremy","last_name":"Gray","email":"jgray4@ocn.ne.jp","country":"France","ip_address":"243.3.36.40"}
...
リンク先の下部にある設定を以下に変更してDownload Data
からダウンロード。
/tmp/MOCK_DATA_ARRAY.jsonとして保存。
- Rows: 1000
- Format: JSON
- array: チェックを入れる
[{"id":1,"first_name":"Sandra","last_name":"Armstrong","email":"sarmstrong0@yolasite.com","country":"Armenia","ip_address":"174.176.14.22"},
{"id":2,"first_name":"Patrick","last_name":"Garrett","email":"pgarrett1@usnews.com","country":"Latvia","ip_address":"229.39.188.192"},
{"id":3,"first_name":"Evelyn","last_name":"Lawrence","email":"elawrence2@skyrock.com","country":"Ukraine","ip_address":"40.11.46.148"},
{"id":4,"first_name":"Jesse","last_name":"Sullivan","email":"jsullivan3@google.co.jp","country":"Philippines","ip_address":"38.139.190.17"},
{"id":5,"first_name":"Irene","last_name":"Thomas","email":"ithomas4@archive.org","country":"Russia","ip_address":"29.172.164.120"},
...
Apache Drillを試す
MOCK_DATA.json(改行で句切られたJSON)にクエリ。
0: jdbc:drill:zk=local> SELECT tbl.first_name,
. . . . . . . . . . . > count(*) AS cnt
. . . . . . . . . . . > FROM dfs.`/tmp/MOCK_DATA.json` AS tbl
. . . . . . . . . . . > GROUP BY tbl.first_name
. . . . . . . . . . . > ORDER BY cnt DESC LIMIT 10;
+--------------+------+
| first_name | cnt |
+--------------+------+
| George | 11 |
| Jimmy | 11 |
| Christopher | 10 |
| Joe | 10 |
| Elizabeth | 9 |
| Henry | 9 |
| Chris | 9 |
| Teresa | 9 |
| Stephanie | 9 |
| Lisa | 9 |
+--------------+------+
10 rows selected (0.353 seconds)
MOCK_DATA_ARRAY.json(正規のJSON配列)にクエリ。
0: jdbc:drill:zk=local> SELECT tbl.first_name,
. . . . . . . . . . . > count(*) AS cnt
. . . . . . . . . . . > FROM dfs.`/tmp/MOCK_DATA_ARRAY.json` AS tbl
. . . . . . . . . . . > GROUP BY tbl.first_name
. . . . . . . . . . . > ORDER BY cnt DESC LIMIT 10;
+-------------+------+
| first_name | cnt |
+-------------+------+
| Ernest | 11 |
| Juan | 10 |
| David | 10 |
| Jane | 9 |
| Alan | 9 |
| Katherine | 9 |
| Gerald | 9 |
| Jesse | 9 |
| Chris | 9 |
| Marie | 8 |
+-------------+------+
10 rows selected (0.326 seconds)
ワイルドカードで複数ファイル(MOCK_DATA.json, MOCK_DATA_ARRAY.json)にクエリ。
0: jdbc:drill:zk=local> SELECT tbl.first_name,
. . . . . . . . . . . > count(*) AS cnt
. . . . . . . . . . . > FROM dfs.`/tmp/MOCK_DATA*.json` AS tbl
. . . . . . . . . . . > GROUP BY tbl.first_name
. . . . . . . . . . . > ORDER BY cnt DESC LIMIT 10;
+-------------+------+
| first_name | cnt |
+-------------+------+
| Juan | 19 |
| Chris | 18 |
| Jimmy | 18 |
| Joe | 17 |
| David | 17 |
| Jesse | 17 |
| Steve | 16 |
| Lisa | 16 |
| Stephanie | 15 |
| Jane | 15 |
+-------------+------+
10 rows selected (1.262 seconds)