sparklyrでExploratoryからSparkに接続してみる(dplyr編)

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

ビッグデータ分析基盤として、もはや定番となっている[Apache Spark](https://spark.apache.org/)。

[前回](https://exploratory.io/note/2ac8ae888097/2569131745987096)はSQLでSparkにSQLクエリを投げてデータ分析をする例をご説明しましたが、今回はdplyrのクエリを使った例をご紹介します。

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

```r
flights <- tbl(sc, "flights") %>%
  group_by(CARRIER, ORIGIN_STATE_ABR) %>% 
  summarize(DEP_DELAY_AVG = mean(DEP_DELAY)) %>%
  top_n(10, DEP_DELAY_AVG) %>%
  collect()
```

Exploratoryのユーザー、もしくは今時のRのユーザーならdplyrの文法(データ・ラングリングのグラマーと言われているもの)に慣れていると思いますが、煩雑なSQLを手で書くのと比べて、格段に直感的にSparkのデータ分析ができます。

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

# 準備

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

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

![](https://camo.qiitausercontent.com/fbd4207ec016fd523a123bb2b29fe281581dd651/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f39303239362f65353138616131632d633438302d313432652d353631322d3866303834366533343430362e706e67)

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

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

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

![](/Users/hidekoji/.exploratory/projects/Sparklyr_9d1c22867a8b/markdown_output/image-1505333321651.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")
```

さて、各航空会社毎に平均出発遅延のトップ10の州を計算してみましょう。dplyrのクエリは以下の通りです。。

```r
flights <- tbl(sc, "flights") %>%
  group_by(CARRIER, ORIGIN_STATE_ABR) %>% 
  summarize(DEP_DELAY_AVG = mean(DEP_DELAY)) %>%
  top_n(10, DEP_DELAY_AVG) %>%
  collect()
```

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

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


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

データを保存して、テーブルビューで結果を確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/0000742c-1767-1c74-360a-f6b7095930f9.png)

このdplyrのクエリの結果をバー・チャートにして、「繰り返し」に航空会社を割り当てると、航空会社毎の出発遅延時間Top10の州を可視化できます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/90296/d60dc064-7fd0-c822-7c7d-5443b578d2d8.png)


# まとめ

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

# データサイエンスを本格的に学んでみたいという方へ
今年10月に、Exploratory社がシリコンバレーで行っている研修プログラムを日本向けにした、[データサイエンス・ブートキャンプ](https://exploratory.io/training-jp?utm_campaign=blog_dbplyr&utm_medium=blog&utm_source=qiita)の第3回目が東京で行われます。本格的に上記のようなデータサイエンスの手法を、プログラミングなしで学んでみたい方、そういった手法を日々のビジネスに活かしてみたい方はぜひこの機会に、参加を検討してみてはいかがでしょうか。[こちら](https://exploratory.io/training-jp?utm_campaign=blog_dbdplyr&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")
flights <- tbl(sc, "flights") %>%
  group_by(CARRIER, ORIGIN_STATE_ABR) %>% 
  summarize(DEP_DELAY_AVG = mean(DEP_DELAY)) %>%
  top_n(10, DEP_DELAY_AVG) %>%
  collect()
```