iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 21
0
Data Technology

Microsoft R Solution系列 第 21

Day21 - Microsoft R Client與MSSQL R Service 互動 Part2

在Day18, 我們在SSMS裡, 撰寫Store Procedure來部屬模型, 沒想到在找資料的時候, 無意間瞄到一篇” Create a Stored Procedure Using sqlrutils”
https://docs.microsoft.com/en-us/sql/advanced-analytics/r/how-to-create-a-stored-procedure-using-sqlrutils
也就是說我們可以從Microsoft Client直接部屬Store Procedure到MSSQL上, 原本以為今年鐵人賽可以順順利利寫完, 沒想到居然卡關了/images/emoticon/emoticon04.gif, 上述的官方文件裡面的說明與範例程式碼, 居然對不起來, 只有自己硬著頭皮一步一步跟著指令說明試試看了, 先拿Day14的小範例來練手, 在RTVS輸入下列程式碼
https://ithelp.ithome.com.tw/upload/images/20180108/20103333OcHUm3hZK5.png

首先要先載入sqlrutils套件, 另外預計在Store Procedure執行的R, 必須包成R Function, 所以Function的參數就是Store Procedure要傳的參數, 然後用InputParameter設定傳入參數, StoredProcedure則是來包預存程序的相關資料, 這裡比較特別的是有filePath要做設定, 當跑這段時, 可以查看一下C:\Temp如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333D4LRQa7xpJ.png

會產生定義好的Store Procedure, 可以打開來看一下如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333UDYqwJL4US.png

是不是很熟悉? 跟Day14寫的是不是很雷同? 透過StoredProcedure這個函數會幫你生成對應的Stored Procedure, 最後用registerStoredProcedure, 然後這個函數就可以註冊到MSSQL, 成功畫面如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333eu9S3o3o6t.png

如果要在Microsoft Client直接執行剛建好的Stored Procedure, 可以使用executeStoredProcedure函數, 程式碼與執行結果如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333vX7gUjCL4e.png

這邊要注意的上面紅框顯示的地方, 原本我們在R Function指定回傳的是data frame, 但是透過Microsoft R Client去執行Stored Procedure時, 最後得到的結果是list, 這個在操作上要特別注意一下, 透過上述的小範例, 搞懂了來龍去脈, 接下來就可以利用Microsoft R Client玩出許多花樣, 舉例來說, 我們直接可以在Microsoft Client, 製作一支取出Day17做好的模型的Stored Procedure, 然後在Microsoft R Client做預測, 原本以為終於可以順利寫完, 結果又遇到怪/images/emoticon/emoticon17.gif, 來看看這隻怪如何解決? 在RTVS輸入底下程式碼
https://ithelp.ithome.com.tw/upload/images/20180108/20103333toyBXUUyZb.png

上述程式碼主要就是從MSSQL取出模型, 類似Day18實作的功能, 紅色部分代表的是從MSSQL 取出 varbinary(max), 在Microsoft R Client顯示的物件類型是ODBC_binary, 就是這個魔王搞了我兩三天,都google不到相關解決方式, 原本以為只要跟Day18一樣, unserialize反序列化回來即可, 沒想到錯誤如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333zbOI6aO8ZG.png

原本的認知是df$MLmodel是ODBC_binary, 然後上面跳出來說是list, 搞得我好亂啊/images/emoticon/emoticon70.gif
拿著錯誤訊息到處拜, 都沒找到相關解決方式, 就在要放棄之際, 無意間掃到變數視窗如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333itfgS7sTpf.png

真的是眾裡搜它千百度, 驀然回首, 答案就在自身處, 結果df$MLmodel是個List物件, 然後List裡有一個ODBC_binary, 好樣的M$, 搞了我三天, 不知該哭還是該笑?, WTF只想罵髒話/images/emoticon/emoticon40.gif, 冷靜地修改程式碼與執行如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333Kqizmw7y7y.png

成功註冊Store Procedure
https://ithelp.ithome.com.tw/upload/images/20180108/20103333fDHmQAbQ0W.png

最後測試一下是否能正確執行?, 成功畫面如下
https://ithelp.ithome.com.tw/upload/images/20180108/20103333k5coL3sZVX.png

本文參考
https://docs.microsoft.com/en-us/machine-learning-server/r-reference/sqlrutils/executestoredprocedure

後記: 又開始擔心能否順利完賽了?/images/emoticon/emoticon06.gif


上一篇
Day20 - Microsoft R Client與MSSQL R Service 互動 Part1
下一篇
Day22 - MSSQL Reporting Service嵌入R 繪圖 Part1 SSRS安裝
系列文
Microsoft R Solution30

尚未有邦友留言

立即登入留言