LoginSignup
2
3

More than 5 years have passed since last update.

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

Posted at

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: チェックを外す
/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)
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3