「SQL Server 2016にはRが統合されている!」というので試して見ました。
とりあえず、
- SQL Serverのストアド内でRスクリプトを実行する
- RからSQLに接続する
を試してみます。
SQL ServerへのR統合の動きは、以前マイクロソフトが買収したRソリューション会社であるRevolution Analytics社の製品との統合で実現しているようです。
関連記事はこちら。
##環境
とりあえず、下記の環境を利用します。
- 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(Revelution Analythics社により拡張されたRのOpen版)
- Revolution R Enterprise 7.5.0(拡張されたライブラリやエンジンやツール類)
これらのツール。特にRevolution R製品は正直馴染みが薄いので位置づけがピンと来ませんが、下記のような関係のようです。
引用: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)がインストールされていないと警告が出ます。
肝心のAdvance Analytics Extensionsにアラートが出ていますが、[Post-installation step are requires...]とのことです。つまり、後処理があるということでこのまま進めます。
あと、複合認証にしておく方がよいみたいです。
どうやらうまく入ったようです。
###Revolution R Open 3.2.2 for Revolution R Enterprise 7.5.0
Revolution R Openを入れます。ダウンロードはこちらからできるようです。
Revolution Analytics社が拡張したRのOpen版。ダウンロードして猿?っぽいアイコンをクリックすればインストールされます。
デスクトップにできるショートカット等をクリックすることで、普通にRとして使えます。
どうやら、RROをRのRuntimeとして利用するものと理解しました。
###Revolution R Enterprise 7.5.0
これは、Rを拡張するライブラリ、エンジン、開発・便利ツール群のようです。ダウンロードはこちらから。
これもアイコンをクリックだけでインストールできますが、C++のラインタイム等、複数のツールが次々にインストールされるようなおで、どんどん「OK」をクリックしていく必要があります。
いろいろなRequirementsがインストールされるようです。
そして、Revolution R本体。
##イントール後の処理
これだけでは使えるようにならないようです。幾つかの処理が必要です。
###external scriptsをenableに
ManagementStudioにて、下記のクエリを実行します。
exec sp_configure 'external scripts enabled', 1;
reconfigure;
これで、外部スクリプトを実行できるようになるようです。今はRですが、Pythonとかもサポートするとかしないとか。
実行すると、
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のバージョンをアップデートしないといけないらしいです。
CTP3ではそのままでいいようですが、CTP3.1以上の場合は、ここからダウンロードして、exeを差し替えます。私はCTP3.2なので差し替えて実行します。
実行すると20個ほどの処理が走るようです。
無事終了したようです。以上でセットアップは完了です。
##動作確認1(SQLのストアド内でRスクリプトの実行)
動作確認をしてみます。testdbを作って(既存のdbでもいいです)、テストスクリプトを実行してみます。
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として貼り付けて実行します。
意味はさておき、@scriptに代入されたRのスクリプトが実行されています。
他の利用例等は、ここを見ればいいでしょう。また、パラメーターの意味などはここを見ればいいです。
だから何?という人も多いでしょうが、少しづつサンプルを追加したいと思います。
##動作確認2(RからSQLの利用)
###RODBCでRからSQL Serverに接続する
本来なら、Rx系のコマンドを利用すべきでしょうが、基本やれることは同じなのと、一般のR環境でも利用できるのでRODBCの接続方法を簡単に書いておきます。
予めSQL Serverにてtestdbを作成し、簡単なデータを挿入しています。ここではtestdbにmembersテーブルを作成しました。
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でなんとでも。
とりあえず、SQLServerまでデータ来ていればあとはRでなんとでもなるというのはいいですね。
Rx系のコマンドを利用したRevoScaleRの特性を活かしたSQLとの連携については調べながら随時更新します。