iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 20
1
Data Technology

Microsoft R Solution系列 第 20

Day20 - Microsoft R Client與MSSQL R Service 互動 Part1

這個MSSQL R Service系列文以Microsoft Client作為起頭, 最後也用Microsoft Client做結尾, 先來看一下底下架構圖
https://ithelp.ithome.com.tw/upload/images/20180107/20103333pXsHQXDTtX.png
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://ithelp.ithome.com.tw/upload/images/20180107/20103333R0kpShQ1b5.png
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://ithelp.ithome.com.tw/upload/images/20180107/20103333b0o7eYYiZS.png
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
https://ithelp.ithome.com.tw/upload/images/20180107/20103333p1a7u8MIva.png

接著在RTVS輸入底下程式碼
https://ithelp.ithome.com.tw/upload/images/20180107/201033330nyLcqUc2i.png

這邊我們利用了三個函數完成寫入MSSQL的動作, 說明如下

RxSqlServerData: 建立MSSQL相關連線資訊
RxTextData: 建立csv檔案相關資訊
rxDataStep: 執行寫入MSSQL動作

成功畫面如下
https://ithelp.ithome.com.tw/upload/images/20180107/20103333q9hnXNx5Sf.png

到SSMS 檢查一下資料是否成功寫入?
https://ithelp.ithome.com.tw/upload/images/20180107/20103333JZBDC89vs0.png

既然成功寫入, 下一步就是從MSSQL將資料Select出來, 在RTVS輸入底下程式碼
https://ithelp.ithome.com.tw/upload/images/20180107/20103333VmINaaHtK8.png

這邊要特別解釋紅色框起來的部分, 原本以為RxSqlServerData會直接就將資料庫資料回來, 但是並沒有, 印出來看如下
https://ithelp.ithome.com.tw/upload/images/20180107/20103333ezz1dU29vX.png

RxSqlServerData這個函數只回傳了MSSQL相關資訊, 那什麼時候, 才會真正載入資料呢? 只有真正要顯示資料時, 才會跟MSSQL要資料
https://ithelp.ithome.com.tw/upload/images/20180107/20103333YiJwLULG8p.png

所以執行上述指令了, 才會從MSSQL把資料取出如下
https://ithelp.ithome.com.tw/upload/images/20180107/20103333DpMpRVkCER.png

如之前所說rx系列開頭, 都是RevoScaleR的函數, 擁有自己的資料結構與格式, 所以要轉換慣用的data frame可以用rxImport來做轉換如下
https://ithelp.ithome.com.tw/upload/images/20180107/20103333iIpo8WptQ5.png

最後來試一下利用MSSQL Server算模型, 在RTVS輸入底下程式碼
https://ithelp.ithome.com.tw/upload/images/20180107/20103333FeNZoWPW7a.png

可以先執行rxGetComputeContext(), 結果如下
https://ithelp.ithome.com.tw/upload/images/20180107/20103333yPK9QMHyZ9.png

而RxLocalSeq Compute Context代表是本地端運算, 另外RxInSqlServer是用來建立MSSQL的連線資訊, rxSetComputeContext則是設定運算環境, 接著執行剩下程式碼, 結果報錯如下
https://ithelp.ithome.com.tw/upload/images/20180107/20103333gTErAAoDaC.png

這個錯誤的原因, 資料來源不符合的關係, df是我們利用rxImport將ds轉成data frame, 而在rxLinMod這個線性函數是不支援data frame的資料來源的, 所以將程式修改如下, 再跑一次如下
https://ithelp.ithome.com.tw/upload/images/20180107/201033338phJfYs9tV.png

在結尾執行rxGetComputeContext(), 此時可以看到已經跑在MSSQL做運算了, 此外RevoScaleR還提供trace功能, 修改程式碼如下, 就可以看到trace過程
https://ithelp.ithome.com.tw/upload/images/20180107/201033339NFqsfKeNK.png

若想再切回本地端運算, 可用下列指令rxSetComputeContext("local")切回來
https://ithelp.ithome.com.tw/upload/images/20180107/20103333WnWiu8PWz1.png

本文參考
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


上一篇
Day19 - MSSQL R Service Part7 與Windows Form互動
下一篇
Day21 - Microsoft R Client與MSSQL R Service 互動 Part2
系列文
Microsoft R Solution30

尚未有邦友留言

立即登入留言