這個MSSQL R Service系列文以Microsoft Client作為起頭, 最後也用Microsoft Client做結尾, 先來看一下底下架構圖
https://docs.microsoft.com/zh-tw/sql/advanced-analytics/r/getting-started-with-sql-server-r-services
如前面提過的, Microsoft Client負責來跟Server溝通的, 在Microsoft的規劃裡, 資料科學家利用Microsoft Client從MSSQL Server撈取資料, 在本地端開發, 若本地端運算資源不足, 還可以丟回去給MSSQL Server算, 模型算出來後, 也可以透過Microsoft Client直接部屬到MSSQL Server上, 另外Microsoft官方支援Server資料來源如下
https://docs.microsoft.com/en-us/machine-learning-server/r/concept-what-is-compute-context#compute-contexts--data-sources-for-revoscaler
如前面所說除了支援MSSQL外, Hadoop與Spark也有支援
分散式運算的支援如下
https://docs.microsoft.com/en-us/machine-learning-server/r/how-to-revoscaler-distributed-computing
那接下來的範例實作是在Microsoft Client先將csv檔案匯入到MSSQL, 再從MSSQL撈取資料後, 交由MSSQL運算
首先我們在SSMS先清空之前建立Position_Salaries Table
接著在RTVS輸入底下程式碼
這邊我們利用了三個函數完成寫入MSSQL的動作, 說明如下
RxSqlServerData: 建立MSSQL相關連線資訊
RxTextData: 建立csv檔案相關資訊
rxDataStep: 執行寫入MSSQL動作
成功畫面如下
到SSMS 檢查一下資料是否成功寫入?
既然成功寫入, 下一步就是從MSSQL將資料Select出來, 在RTVS輸入底下程式碼
這邊要特別解釋紅色框起來的部分, 原本以為RxSqlServerData會直接就將資料庫資料回來, 但是並沒有, 印出來看如下
RxSqlServerData這個函數只回傳了MSSQL相關資訊, 那什麼時候, 才會真正載入資料呢? 只有真正要顯示資料時, 才會跟MSSQL要資料
所以執行上述指令了, 才會從MSSQL把資料取出如下
如之前所說rx系列開頭, 都是RevoScaleR的函數, 擁有自己的資料結構與格式, 所以要轉換慣用的data frame可以用rxImport來做轉換如下
最後來試一下利用MSSQL Server算模型, 在RTVS輸入底下程式碼
可以先執行rxGetComputeContext(), 結果如下
而RxLocalSeq Compute Context代表是本地端運算, 另外RxInSqlServer是用來建立MSSQL的連線資訊, rxSetComputeContext則是設定運算環境, 接著執行剩下程式碼, 結果報錯如下
這個錯誤的原因, 資料來源不符合的關係, df是我們利用rxImport將ds轉成data frame, 而在rxLinMod這個線性函數是不支援data frame的資料來源的, 所以將程式修改如下, 再跑一次如下
在結尾執行rxGetComputeContext(), 此時可以看到已經跑在MSSQL做運算了, 此外RevoScaleR還提供trace功能, 修改程式碼如下, 就可以看到trace過程
若想再切回本地端運算, 可用下列指令rxSetComputeContext("local")切回來
本文參考
https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/deepdive-create-sql-server-data-objects-using-rxsqlserverdata
https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/deepdive-define-and-use-compute-contexts