Apache Drillの導入〜サンプル実行〜カスタマイズ(完全版)

#Apache Drillの導入〜サンプル実行〜カスタマイズ(完全版)

- とても面白いです。

---
System requirements

|**Software**|**Version**|
|------------|-----------|
| OS | Cent OS 6.0(final) |
| Java | Open JDK 6 |
|------------|-----------|

---
The system will be ...

|**Software**|**Version**|
|------------|-----------|
| OS | Cent OS 6.0(final) |
| Java | Open JDK 8 |
| Apache Drill | 0.7.0|
|------------|-----------|

---
##0 Javaのアップグレード

現在インストールされているJDKの削除

- 確認

~~~sh
su
java -version
#>java version "1.6.0_33"
#>OpenJDK Runtime Environment (IcedTea6 1.13.5) (rhel-1.13.5.1.el6_6-x86_64)
#>OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
~~~

- 削除&最新版のJDKを確認

~~~sh
yum -y remove java-1.6.0-openjdk
yum search java | grep 'java-'
~~~

最新版のJDKをインストール

~~~sh
yum -y install java-1.8.0-openjdk-devel.x86_64
sed -i -e 's/^export\ JAVA_HOME/#export\ JAVA_HOME/g' /etc/profile;
sed -i -e '/^#export\ JAVA_HOME/a export\ JAVA_HOME=\/usr\/lib\/jvm\/java-1\.8\.0-openjdk-1\.8\.0\.25-3\.b17\.el6_6\.x86_64\/' /etc/profile;
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-3.b17.el6_6.x86_64
echo "export PATH=\$PATH:$JAVA_HOME/bin" >> /etc/profile
export PATH=$PATH:$JAVA_HOME/bin
alternatives --install /usr/bin/java java /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-3.b17.el6_6.x86_64/bin/java 2
alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-3.b17.el6_6.x86_64/bin/javac 1
~~~

~~~sh
alternatives --config java
~~~

~~~sh
alternatives --config javac
~~~

#1 ダウンロードおよび解凍
Drillの最新版を[公式ページ](http://drill.apache.org/download/)からダウンロードします。

~~~sh
su
mkdir /usr/local/download/
cd /usr/local/download/
wget http://getdrill.org/drill/download/apache-drill-0.7.0.tar.gz
tar xzvf apache-drill-0.7.0.tar.gz
mv apache-drill-0.7.0 ../
cd ../
ln -s apache-drill-0.7.0 drill
echo "PATH=\$PATH:/usr/local/drill/bin" >> /etc/profile
export PATH=$PATH:/usr/local/drill/bin
~~~

#2 サンプルデータの準備
今回はYelp Dataset Challengeの[データ](http://engineeringblog.yelp.com/2014/08/the-yelp-dataset-challenge-goes-international-new-data-new-cities-open-to-students-worldwide.html)を利用します。

~~~sh
cd /usr/local/download/
wget https://www.OneDrive.com/s/xg9r2msqj9ufa83/yelp_dataset_challenge_academic_dataset.tar?dl=0
mkdir yelp
mv yelp_dataset_challenge_academic_dataset.tar ./yelp/
cd yelp
tar xzvf yelp_dataset_challenge_academic_dataset.tar
cd ..
mv yelp/ /usr/share/
~~~

#3 実行

~~~sh
sqlline -u jdbc:drill:zk=local
~~~

##3.1 Yelpビジネスデータの内容を見てみる

~~~sh
#sqllineのシェル上で実行
select * from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` limit 1;
~~~

<img width="1910" alt="Apache Drill Fig 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/a96fd941-88b9-d022-0e94-efee40c6d5ae.png">

##3.2 データセットに含まれるレビュー数の合計値

~~~sh
select sum(review_count) as totalreviews from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json`;
~~~

<img width="247" alt="Apache Drill Fig 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/e0c74e99-ec25-6b00-7c5f-ec84e164dc1f.png">

##3.3 合計レビュー数がトップの州と都市

~~~sh
select state, city, count(*) totalreviews from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` group by state, city order by count(*) desc limit 10;
~~~

<img width="345" alt="Apache Drill Fig 3.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/1433b12f-ea08-aedd-447b-01e648649ff1.png">

##3.4 ビジネス格付け別の平均レビュー数

~~~sh
select stars,trunc(avg(review_count)) reviewsavg from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` group by stars order by stars desc;
~~~

<img width="250" alt="Apache Drill Fig 4.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/7a62bc93-0ead-d807-4571-445bc449dd1c.png">


##3.5 レビュー数が多い (1000回以上) トップビジネス

~~~sh
select name, state,city, `review_count` from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` where review_count > 100 order by `review_count` desc limit 10;
~~~

<img width="597" alt="Apache Drill Fig 5.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/9095af37-0744-8d0d-1d25-53b11935312d.png">


##3.6 一部ビジネスの土曜日の開店・閉店時間を確認
==※Drillにより、マルチ構造のネスト全体を調査できることにご注目ください。==

~~~sh
select b.name, b.hours.Saturday.`open`, b.hours.Saturday.`close` from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` b limit 10;
~~~

<img width="466" alt="Apache Drill Fig 6.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/4bbc569b-f493-5576-bd64-313b8bd247ec.png">

##3.7 テキストモードをオンにして、あらゆるテキストを検索する。
###3.7.1 テキストモードをオンにする。
~~~sh
alter system set `store.json.all_text_mode` = true;
~~~

###3.7.2 データセット内の各ビジネスの特典を調べます。
Yelpビジネスデータセットの属性欄には、各行ごとに異なる要素が入っており、ビジネスに別々の特典を設けられるようになっています。Drillでは、スキーマを変えて素早く簡単にデータセットを分析できます。
まず、あらゆるテキストモードで機能するようにDrillを設定します (あらゆるデータを調査できるようにするため)。

~~~sh
select attributes from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` limit 10;
~~~

<img width="1911" alt="Apache Drill Fig 7.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/2ecb4c07-46ef-1677-c511-e095153970bd.png">

###3.7.3

~~~sh
alter system set `store.json.all_text_mode` = false;
~~~

##3.8 データセット内のレストランビジネスについて調査します。

###3.8.1 データセット内にいくつのレストランが存在するか？

~~~sh
select count(*) as TotalRestaurants from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` where true=repeated_contains(categories,'Restaurants');
~~~

<img width="245" alt="Apache Drill Fig 8.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/f2e0df9c-c812-0b7b-8430-3128f80b8eca.png">


###3.8.2 レビュー数トップのレストラン
~~~sh
select name,state,city,`review_count` from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` where true=repeated_contains(categories,'Restaurants') order by `review_count` desc limit 10;
~~~

<img width="541" alt="Apache Drill Fig 9.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/a2776c9a-ca41-7589-46e8-e04b399309de.png">


###3.8.3 カテゴリ数トップのレストラン
~~~sh
select name,repeated_count(categories) as categorycount, categories from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` where true=repeated_contains(categories,'Restaurants') order by repeated_count(categories) desc limit 10;
~~~

<img width="1567" alt="Apache Drill Fig 10.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/30c9912f-e46d-ff42-b869-c91025d77ef2.png">


###3.8.4 レビュー数トップのカテゴリ
~~~sh
select categories[0], count(categories[0]) as categorycount from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` group by categories[0] order by count(categories[0]) desc limit 10;
~~~

<img width="322" alt="Apache Drill Fig 11.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/a7c18db0-a72f-a035-7e5d-65ca1a2d2a65.png">

##3.9 Yelpレビューのデータセットを調査し、ビジネスと組み合わせます。

###3.9.1 Yelpレビューのデータセットの内容を調査します。
~~~sh
select * from dfs.`/usr/share/yelp/yelp_academic_dataset_review.json` limit 1;
~~~

<img width="1911" alt="Apache Drill Fig 12.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/5461ae87-64b8-57b5-b407-7b96f0fd40d0.png">


###3.9.2 評価の良いレビューが投稿されているビジネス
ここでは、総レビュー数 (review_count) が含まれるYelpビジネスデータセットを、各レビューの追加詳細が含まれるYelpレビューデータに組み合わせています。

~~~sh
Select b.name from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` b where b.business_id in (SELECT r.business_id FROM dfs.`/usr/share/yelp/yelp_academic_dataset_review.json` r GROUP BY r.business_id having sum(r.votes.cool) > 2000 order by sum(r.votes.cool)  desc);
~~~

<img width="268" alt="Apache Drill Fig 13.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/ab0535b2-3843-4407-06c9-7b8cc8dcccf1.png">


###3.9.3 ビジネスとレビューのデータセットを組み合わせたビューを作成
Drillのビューは軽量なので、ローカルのファイルシステムで作れます。スタンドアローンモードのDrillには、dfs.tmpワークスペースが付いてきます。これをビューの作成に使用できます。 (あるいは、ご自分のローカルまたは分散型ファイルシステムで独自のワークスペースを定義しても構いません)。データを論理的ビューではなく物理的なままにしておきたい場合は、CREATE TABLE AS SELECT構文を使うことができます。

~~~sh
create or replace view dfs.tmp.businessreviews as Select b.name,b.stars,b.state,b.city,r.votes.funny,r.votes.useful,r.votes.cool, r.`date` from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` b , dfs.`/usr/share/yelp/yelp_academic_dataset_review.json` r where r.business_id=b.business_id;
~~~

<img width="646" alt="Apache Drill Fig 14.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/8637ba40-0b11-af55-bf25-613b99c9d611.png">

###3.9.4 ビューから合計記録数を取得

~~~sh
select count(*) as Total from dfs.tmp.businessreviews;
~~~

<img width="235" alt="Apache Drill Fig 15.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/305fb415-b6c4-d099-1eab-bca45145068e.png">


これらのクエリに加え、DrillのSQL機能を使えば、格段に詳細な分析が可能になります。マニュアルでクエリを記述したくない場合は、Tableau/MicrostrategyなどのBI/分析ツールを使って、生ファイル/Hive/HBaseデータのクエリを行い、Drill ODBC/JDBCドライバーを使って直接Drillで作成したビューをクエリすることが可能です。
Apache Drillでは、データ分析に、これまでのSQL技術では見たことのないような自由と柔軟性を提供することを目的としています。当コミュニティでは、今後のリリースに向けて、ネスト化したデータや変化するスキーマを使ったデータサポート周り対して更にユニークな機能を開発中です。
例えば、更に詳細なSQL機能を適用できるように、半構造化データを動的に関連付けするために使用できる新たな「結合」機能を開発中です (0.7の新機能)。クエリに対する結合機能の使用法をご紹介します。

###3.9.5 それぞれのビジネスについて、結合されたカテゴリー一覧を取得

~~~sh
select name, flatten(categories) as category from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` limit 20;
~~~

<img width="480" alt="Apache Drill Fig 16.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/b8728ea0-cf81-bb8c-b608-ec56ad75247a.png">

###3.9.6 ビジネスレビューで使用されるトップのカテゴリ

~~~sh
select celltbl.catl, count(celltbl.catl) categorycnt from (select flatten(categories) catl from dfs.`/usr/share/yelp/yelp_academic_dataset_business.json` ) celltbl group by celltbl.catl order by count(celltbl.catl) desc limit 10;
~~~
<img width="280" alt="Apache Drill Fig 17.png" src="https://qiita-image-store.s3.amazonaws.com/0/9023/173db4c4-34c6-6285-b8f4-18ed0776162e.png">



---
#References
[こちらのページ](http://www.hadoop-times.com/technology/how-turn-raw-data-yelp-insights-minutes-apache-drill.html)を参考にしながら行いました。