SQLServer

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

More than 1 year has passed since last update.

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

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

を試してみます。

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

関連記事はこちら

環境

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

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

sqlr
引用: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

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

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

sqlr

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

Revolution R Open 3.2.2 for Revolution R Enterprise 7.5.0

Revolution R Openを入れます。ダウンロードはこちらからできるようです。
Revolution Analytics社が拡張したRのOpen版。ダウンロードして猿?っぽいアイコンをクリックすればインストールされます。

sqlr

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

sqlr

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

Revolution R Enterprise 7.5.0

これは、Rを拡張するライブラリ、エンジン、開発・便利ツール群のようです。ダウンロードはこちらから。
これもアイコンをクリックだけでインストールできますが、C++のラインタイム等、複数のツールが次々にインストールされるようなおで、どんどん「OK」をクリックしていく必要があります。

sqlr

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

sqlr

そして、Revolution R本体。

sqlr

イントール後の処理

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

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のバージョンをアップデートしないといけないらしいです。

sqlr

引用:https://msdn.microsoft.com/en-us/library/mt590536.aspx

CTP3ではそのままでいいようですが、CTP3.1以上の場合は、ここからダウンロードして、exeを差し替えます。私はCTP3.2なので差し替えて実行します。

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

sqlr

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

動作確認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として貼り付けて実行します。

sqlr

意味はさておき、@scriptに代入されたRのスクリプトが実行されています。
他の利用例等は、ここを見ればいいでしょう。また、パラメーターの意味などはここを見ればいいです。

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

動作確認2(RからSQLの利用)

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

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

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

sqlr

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

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

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