在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上, 原本以為今年鐵人賽可以順順利利寫完, 沒想到居然卡關了, 上述的官方文件裡面的說明與範例程式碼, 居然對不起來, 只有自己硬著頭皮一步一步跟著指令說明試試看了, 先拿Day14的小範例來練手, 在RTVS輸入下列程式碼
首先要先載入sqlrutils套件, 另外預計在Store Procedure執行的R, 必須包成R Function, 所以Function的參數就是Store Procedure要傳的參數, 然後用InputParameter設定傳入參數, StoredProcedure則是來包預存程序的相關資料, 這裡比較特別的是有filePath要做設定, 當跑這段時, 可以查看一下C:\Temp如下
會產生定義好的Store Procedure, 可以打開來看一下如下
是不是很熟悉? 跟Day14寫的是不是很雷同? 透過StoredProcedure這個函數會幫你生成對應的Stored Procedure, 最後用registerStoredProcedure, 然後這個函數就可以註冊到MSSQL, 成功畫面如下
如果要在Microsoft Client直接執行剛建好的Stored Procedure, 可以使用executeStoredProcedure函數, 程式碼與執行結果如下
這邊要注意的上面紅框顯示的地方, 原本我們在R Function指定回傳的是data frame, 但是透過Microsoft R Client去執行Stored Procedure時, 最後得到的結果是list, 這個在操作上要特別注意一下, 透過上述的小範例, 搞懂了來龍去脈, 接下來就可以利用Microsoft R Client玩出許多花樣, 舉例來說, 我們直接可以在Microsoft Client, 製作一支取出Day17做好的模型的Stored Procedure, 然後在Microsoft R Client做預測, 原本以為終於可以順利寫完, 結果又遇到怪, 來看看這隻怪如何解決? 在RTVS輸入底下程式碼
上述程式碼主要就是從MSSQL取出模型, 類似Day18實作的功能, 紅色部分代表的是從MSSQL 取出 varbinary(max), 在Microsoft R Client顯示的物件類型是ODBC_binary, 就是這個魔王搞了我兩三天,都google不到相關解決方式, 原本以為只要跟Day18一樣, unserialize反序列化回來即可, 沒想到錯誤如下
原本的認知是df$MLmodel是ODBC_binary, 然後上面跳出來說是list, 搞得我好亂啊
拿著錯誤訊息到處拜, 都沒找到相關解決方式, 就在要放棄之際, 無意間掃到變數視窗如下
真的是眾裡搜它千百度, 驀然回首, 答案就在自身處, 結果df$MLmodel是個List物件, 然後List裡有一個ODBC_binary, 好樣的M$, 搞了我三天, 不知該哭還是該笑?, WTF只想罵髒話, 冷靜地修改程式碼與執行如下
成功註冊Store Procedure
最後測試一下是否能正確執行?, 成功畫面如下
後記: 又開始擔心能否順利完賽了?