MacからApache Drillを使ってローカル上のJSONファイルに対してクエリを実行

Apache Drillについては以下の記事が詳しいです。

* [Apache Drill ではクエリ処理はこんな風に行われる（Hadoop アドベントカレンダー 2013 16日目） - nagix](http://nagix.hatenablog.com/entry/2013/12/16/165023)

抜粋:

> 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データを作成する。

* [Mockaroo - Random Data Generator | CSV / JSON / SQL / Excel](http://www.mockaroo.com/)

Drillの動作確認のために改行で句切られたJSONと正規のJSON配列の２パターンを用意する。

リンク先の下部にある設定を以下に変更して`Download Data`からダウンロード。
/tmp/MOCK_DATA.jsonとして保存。

* Rows: 1000
* Format: JSON
* array: チェックを外す

```/tmp/MOCK_DATA.json
{"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: チェックを入れる

```/tmp/MOCK_DATA_ARRAY.json
[{"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)
```