SparklyrでExploratoryからSparkに接続してみる (SQL編)

# SparklyrでExploratoryからSparkに接続してみる (SQL編)

ビッグデータ分析基盤として、もはや定番となっている[Apache Spark](https://spark.apache.org/)。今日はExploratoryから[sparklyr](https://spark.rstudio.com/)というRのパッケージを使って、Apache Sparkに接続しデータを活用する方法をご説明します。

sparklyrを使うメリットとしては、 SQLでSparkにSQLクエリを投げることができるという点があります。(他にもSparkならではの分散処理や、ユーザー定義関数の実行もありますが、これはまた別のポストで説明します)

例えば、Sparkにアメリカの航空会社の遅延データがあったとすると、以下のようにSQLクエリを投げてSparkからデータを取得できます。

```r
# SparkにSQLクエリを投げる
library(DBI)
flights <- dbGetQuery(sc, 'SELECT FL_DATE, CARRIER, FL_NUM, ORIGIN,
 ORIGIN_CITY_NAME, DEST, DEST_CITY_NAME, DEP_TIME, DEP_DELAY, ARR_DELAY FROM flights WHERE DEP_DELAY <= 0')
flights %>% collect()
```

Sparkというと、ScalaやPython等のプログラミング言語を使ってアクセスする方法もありますが、やはりSQLクエリでアクセスできるのは多くのSQLを知っているユーザーには嬉しい機能ではないでしょうか。

ということで、今日はExploratoryの中から、sparklyrを使ってSparkにSQLクエリーを投げて、その結果だけをスマートに取ってくるにはどうするかということを紹介をしたいと思います。

# 準備

まずは最初に、sparklyrというRパッケージと、Javaをインストールします。

## sparklyrパッケージのインストール
dplyrでデータベースに接続するには、[sparklyr](http://dbplyr.tidyverse.org/articles/dbplyr.html)というというRから直接SparkにアクセスするためのRのパッケージをインストールする必要があります。
Exploratoryの中で、CRANからsparklyrパッケージを以下のように直接インストールします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/e518aa1c-c480-142e-5612-8f0846e34406.png)

## Javaのインストール
お使いのマシンにJavaがインストールされてない場合は、
[こちら](http://www.oracle.com/technetwork/java/javase/downloads/index.html)からダウンロードしてインストールしてください。

# SparkからSQLでデータを読み込む

次に、Rスクリプトを使ったデータソースでSparkに`sparklyr`を使って接続します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/79770a2a-0d2e-b70e-ca0e-6e3147aca730.png)

Rスクリプトの中で、次のようにSparkに接続します。(ここではlocalにデプロイしたSparkを例として取り上げています。)

```r
# Sparkに接続 (ローカルのマシンの例)
# 環境変数の設定
Sys.setenv(SPARK_HOME = "/Users/hidekoji/spark/spark-2.2.0-bin-hadoop2.7")
# sparklyrを読み込む
library(sparklyr)
# Sparkに接続する
sc <- spark_connect(master = "spark://Hidetakas-MacBook-Pro.local:7077")
```

さて、次に、Spark上にすでに読み込まれているSpark Data Frame `flights`に対して、`DBI`パッケージのdbGetQuery関数を使って、出発州毎の平均出発遅延を計算してみましょう。Sparkに投げるSQLクエリは以下の通りです。

```r
# DBIパッケージをロード
library(DBI)
flights <- dbGetQuery(sc, 'SELECT ORIGIN_STATE_ABR, AVG(DEP_DELAY) AS DEP_DELAY_AVG
FROM flights
GROUP BY ORIGIN_STATE_ABR')
flights %>% collect()
```

最後の`collect()`はクエリの実行結果をデータフレームにするための関数です。この記事の一番最後にこの2つのセクションをまとめたスクリプトがありますので、コピー & ペーストとして、必要な部分を変更して試せます。

![image.png](https://cdn-images-1.medium.com/max/1600/1*_roT7ehYxPj5RZBaicK1PA.png)


`データの取得`ボタンををクリックして結果を確認し、`保存`ボタンをクリックし、データフレームとして保存します。

データを保存すると、このようにサマリビューで、結果を確認できます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/5314dc7e-eddd-bb56-31cf-e781193d192b.png)


このSQLクエリの結果、州毎の平均遅延情報を地図の上に可視化してみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/eca6bc60-83e0-51c1-e1a0-ae00e4f4d9e4.png)

# まとめ
[sparklyr](http://dbplyr.tidyverse.org/articles/dbplyr.html)を使うと、このようにSparkに接続して、ScalaやPythonでプログラミングしなくても、SQLクエリでデータを取得し、可視化やさらなる分析が可能になります。

# データサイエンスを本格的に学んでみたいという方へ
今年10月に、Exploratory社がシリコンバレーで行っている研修プログラムを日本向けにした、[データサイエンス・ブートキャンプ](https://exploratory.io/training-jp?utm_campaign=blog_spark_sql&utm_medium=blog&utm_source=qiita)の第3回目が東京で行われます。本格的に上記のようなデータサイエンスの手法を、プログラミングなしで学んでみたい方、そういった手法を日々のビジネスに活かしてみたい方はぜひこの機会に、参加を検討してみてはいかがでしょうか。[こちら](https://exploratory.io/training-jp?utm_campaign=blog_spark_sql&utm_medium=blog&utm_source=qiita)に詳しい情報がありますのでぜひご覧ください。

# 補足

## この例を試すには

以下のスクリプトをRスクリプトデータソースとしてコピー & ペーストして、必要に応じて変更後実行してください。

```r
# Sparkに接続 (ローカルのマシンの例)
# 環境変数の設定
Sys.setenv(SPARK_HOME = "/Users/hidekoji/spark/spark-2.2.0-bin-hadoop2.7")
# sparklyrを読み込む
library(sparklyr)
# Sparkに接続する
sc <- spark_connect(master = "spark://Hidetakas-MacBook-Pro.local:7077")
# DBIパッケージをロード
library(DBI)
flights <- dbGetQuery(sc, 'SELECT ORIGIN_STATE_ABR, AVG(DEP_DELAY) AS DEP_DELAY_AVG
FROM flights
GROUP BY ORIGIN_STATE_ABR')
flights %>% collect()
```