SQL Server 2016 (CTP3.2)で R Services を使ってみる


「SQL Server 2016にはRが統合されている！」というので試して見ました。
とりあえず、

* SQL Serverのストアド内でRスクリプトを実行する
* RからSQLに接続する

を試してみます。

SQL ServerへのR統合の動きは、以前マイクロソフトが買収したRソリューション会社であるRevolution Analytics社の製品との統合で実現しているようです。

関連記事は[こちら](http://www.publickey1.jp/blog/16/rmicrosoft_r_server.html)。

##環境

とりあえず、下記の環境を利用します。

* Windows Server 2016 Technical Preview 4（WS2012 R2でも動きます）
* SQL Server 2016 CTP3.2（特にAdvanced Analytics Extensionsというコンポーネントが必要）
* [Revolution R Open 3.2.2 for Revolution R Enterprise 7.5.0](https://www.microsoft.com/en-us/download/details.aspx?id=49525)（Revelution Analythics社により拡張されたRのOpen版）
* [Revolution R Enterprise 7.5.0](https://www.microsoft.com/en-us/download/details.aspx?id=49505)（拡張されたライブラリやエンジンやツール類）

これらのツール。特にRevolution R製品は正直馴染みが薄いので位置づけがピンと来ませんが、下記のような関係のようです。

![sqlr](http://www.bluecode.jp/qiita/sqlr/011.png)
引用：http://www.slideshare.net/RevolutionAnalytics/introducing-revolution-r-open-enhanced-open-source-r-distribution-from-revolution-analytics

ベースには、R+CRAN（普通のR）があり、それをマルチスレッド等に強化したRevelution R Openがあり、さらにそれらを強化するライブラリや並列処理に対応したエンジン、開発環境等を加えたものがRevelution R Enterpriseのようです。

上述の通り、RROやRREは独立したツールですが、SQL ServerにAdvanced Analytics Extensionsをインストールすることで、これらのツールと（SQL Server Launchpadを介して？）連携することで、ストアド内でRスクリプトの実行等ができるようになるようです。

>なお、RからSQLへの接続はRODBC等を使えば前からできましたが、Revolution Rでは、独自にRxSqlServerData()等、Rxから始まる各種関数が利用できるようです。

##インストール

###Windows Server 2016

この機会に初めて利用してみましたが、特に迷うことはありません。OSの基本インストールに加え、

* .NET Framework 3.5（SQL Serverのインストールに必要）
* JDK8（新コンポーネント？のPolyBaseのインストールに必要らしい）
* IIS（Reporting Servicesに文句を言われないため）

をインストールしました。詳細は割愛。

###SQL Server 2016 CT3.2

まあ、ガイダンスに従ってインストールしておけばいいのですが、旧バージョンに加え、少々新しい画面があるので、中止しながら進めます。

インストール前のチェック。.NET Framework 3.5やJDK(JRE)がインストールされていないと警告が出ます。

![sqlr](http://www.bluecode.jp/qiita/sqlr/001.png)

肝心のAdvance Analytics Extensionsにアラートが出ていますが、[Post-installation step are requires...]とのことです。つまり、後処理があるということでこのまま進めます。

あと、複合認証にしておく方がよいみたいです。

![sqlr](http://www.bluecode.jp/qiita/sqlr/002.png)

どうやらうまく入ったようです。

###Revolution R Open 3.2.2 for Revolution R Enterprise 7.5.0

Revolution R Openを入れます。ダウンロードは[こちら](https://www.microsoft.com/en-us/download/details.aspx?id=49525)からできるようです。
Revolution Analytics社が拡張したRのOpen版。ダウンロードして猿？っぽいアイコンをクリックすればインストールされます。

![sqlr](http://www.bluecode.jp/qiita/sqlr/003.png)

デスクトップにできるショートカット等をクリックすることで、普通にRとして使えます。

![sqlr](http://www.bluecode.jp/qiita/sqlr/004.png)

どうやら、RROをRのRuntimeとして利用するものと理解しました。

###Revolution R Enterprise 7.5.0

これは、Rを拡張するライブラリ、エンジン、開発・便利ツール群のようです。ダウンロードは[こちら](https://www.microsoft.com/en-us/download/details.aspx?id=49505)から。
これもアイコンをクリックだけでインストールできますが、C++のラインタイム等、複数のツールが次々にインストールされるようなおで、どんどん「OK」をクリックしていく必要があります。

![sqlr](http://www.bluecode.jp/qiita/sqlr/005.png)

いろいろなRequirementsがインストールされるようです。

![sqlr](http://www.bluecode.jp/qiita/sqlr/006.png)

そして、Revolution R本体。

![sqlr](http://www.bluecode.jp/qiita/sqlr/007.png)

##イントール後の処理

これだけでは使えるようにならないようです。幾つかの処理が必要です。

###external scriptsをenableに

ManagementStudioにて、下記のクエリを実行します。

```sql
exec sp_configure 'external scripts enabled', 1; 
reconfigure;
```

これで、外部スクリプトを実行できるようになるようです。今はRですが、Pythonとかもサポートするとかしないとか。

実行すると、

```sql
Configuration option 'external scripts enabled' changed from 0 to 1. Run the RECONFIGURE statement to install.
```
と表示され、どうやら0(OFF)から1(ON)になったようです。

###Rに割り振るメモリ量を増やす（オプション）

必要に応じてRに割り振るメモリ量を変更できるようです。素のRは全てをメモリで処理するので、拡張しているRとはいえ、メモリは多いほうが良いのかもしれませんが、ここではそのままにします（何もしません）。

###post-installationスクリプをを実行する

基本的に、

```
"C:\Program files\RRO\RRO-3.2.2-for-RRE-7.5.0\R-3.2.2\library\RevoScaleR\rxLibs\x64\registerRext.exe" /install
```

と実行すれば良いようなのですが、CTP3.1以上では、実行するregisterRext.exeのバージョンをアップデートしないといけないらしいです。

![sqlr](http://www.bluecode.jp/qiita/sqlr/010.png)
>引用：https://msdn.microsoft.com/en-us/library/mt590536.aspx

CTP3ではそのままでいいようですが、CTP3.1以上の場合は、[ここ](http://go.microsoft.com/fwlink/?LinkId=723194)からダウンロードして、exeを差し替えます。私はCTP3.2なので差し替えて実行します。

実行すると20個ほどの処理が走るようです。

![sqlr](http://www.bluecode.jp/qiita/sqlr/008.png)

無事終了したようです。以上でセットアップは完了です。

##動作確認１（SQLのストアド内でRスクリプトの実行）

動作確認をしてみます。testdbを作って（既存のdbでもいいです）、テストスクリプトを実行してみます。

```sql
use testdb;
go

execute sp_execute_external_script
	@language = N'R',
	@script= N'x <- c("hoge","foo","boo");
	         OutputDataSet <- as.data.frame(x);',
	@input_data_1 = N'select 1 as tmp1;'
with result sets ((name char(20) not null));
```

このスクリプトを新規Queryとして貼り付けて実行します。

![sqlr](http://www.bluecode.jp/qiita/sqlr/009.png)

意味はさておき、@scriptに代入されたRのスクリプトが実行されています。
他の利用例等は、[ここ](https://msdn.microsoft.com/en-us/library/mt591996.aspx)を見ればいいでしょう。また、パラメーターの意味などは[ここ](https://msdn.microsoft.com/en-us/library/mt604368.aspx)を見ればいいです。

だから何？という人も多いでしょうが、少しづつサンプルを追加したいと思います。

##動作確認２（RからSQLの利用）

###RODBCでRからSQL Serverに接続する

本来なら、Rx系のコマンドを利用すべきでしょうが、基本やれることは同じなのと、一般のR環境でも利用できるのでRODBCの接続方法を簡単に書いておきます。

予めSQL Serverにてtestdbを作成し、簡単なデータを挿入しています。ここではtestdbにmembersテーブルを作成しました。

![sqlr](http://www.bluecode.jp/qiita/sqlr/012.png)

Rコンソールにて以下の様にします。

```r
#パッケージのインストール
> install.package("RODBC")
#ライブラリのロード
> library(RODBC)

#接続文字列設定
> cn <- odbcDriverConnect(connection="Driver={SQL Server Native Client 11.0};server=localhost;database=testdb;trusted_connection=yes;")

#クエリ
> results <- sqlQuery(cn,"select * from members")

#中身確認（データフレームになっている）
> results
  id name sales
1  1 hoge   100
2  2  foo   200
3  3  boo   300

#別ウインドウで表示
> View(results)

#合計計算（お好きにどうぞ）
> sum(results$sales)
[1] 600

#棒グラフ表示
> barplot(results$sales)
```

実際のRコンソールのキャプチャはこんな感じ。SQLのテーブルは普通にデータフレームとして読み込まれるので後はRでなんとでも。

![sqlr](http://www.bluecode.jp/qiita/sqlr/014.png)

とりあえず、SQLServerまでデータ来ていればあとはRでなんとでもなるというのはいいですね。

Rx系のコマンドを利用したRevoScaleRの特性を活かしたSQLとの連携については調べながら随時更新します。