1

R 集成到 SQL Server 2016 (CTP3):我正在使用新的 sp_execute_external_script 创建线性回归模型。有没有办法将有关训练模型的系数数据发送到 output_data_1_name ?

例如,在 R 脚本的正文中,如果您发出: print(myModel); 它在 SSMS 输出窗口(不是 output_data)中打印:

Call:
lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData)

Coefficients:
  (Intercept)       IndepVar1  IndepVar2
      123.456       25.456     56.382

是否可以将其放入数据框中?那会更好,因为我还想获取 t 值和 R 平方并将其存储到表中。即使是 varchar(max) 也可以。我只是自己解析它。

这是我最近尝试过的:

declare @rx_model varbinary(max) = (select model from dbo.Mymodel)
exec dbo.sp_execute_external_script 
@language              = N'R',
@script                = N'require("RevoScaleR");
Mymodel                <- unserialize(rx_model);
Mymodelsummary         = summary(Mymodel);
A1 = Mymodelsummary[1]; 
A2 = Mymodelsummary[2];
A3 = Mymodelsummary[3];
A4 = Mymodelsummary[4];
A5 = Mymodelsummary[5];
summary_Text = data.frame( c(A4, A5) ); ', 
@input_data_1          = N'', 
@input_data_1_name     = N'', 
@output_data_1_name    = N'summary_Text',
@params                = N'@rx_model varbinary(max)', 
@rx_model              = @rx_model
with result sets (("A4" nvarchar(max), "A5" nvarchar(max) ));

我在 SQL Server 2016 CTP3 中遇到的错误是:

消息 39004,级别 16,状态 20,第 0 行执行“sp_execute_external_script”期间发生“R”脚本错误,HRESULT 为 0x80004004。消息 39019,级别 16,状态 1,行 0 发生外部脚本错误:as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) 中的错误:无法强制类“”摘要。 rxLinMod"" 到 data.frame 调用:source ... data.frame -> as.data.frame -> as.data.frame.default ScaleR 中的错​​误。检查输出以获取更多信息。eval 中的错误(expr、envir、enclos):ScaleR 中的错​​误。检查输出以获取更多信息。调用:source -> withVisible -> eval -> eval -> .Call Execution halted Msg 11536, Level 16, State 1, Line 2 EXECUTE 语句失败,因为它的 WITH RESULT SETS 子句指定了 1 个结果集,

所以我想知道如何从 SQL 中的 sp_execute_external_script 中获取该输出。MSDN 对 R 本身的介绍不多。SQL 抱怨模型的输出不能被“强制”到数据框。我想知道 R-Script 中的哪些操作可以将其“戏弄”到数据框中。

4

2 回答 2

1

如果您想获得 a nvarchar,可以尝试以下操作:

EXEC sp_execute_external_script
@language = N'R'
, @script = N'
mymodel <- lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData);
coefficients <- paste(names(mymodel$coefficients), mymodel$coefficients, sep="=", collapse = " ");
'
, @input_data_1 = N'select DepVar, IndepVar1, IndepVar2 from myDemoData'
, @input_data_1_name = N'myDemoData'
, @output_data_1_name = N'coefficients'
WITH RESULT SETS (( coefficients nvarchar(max)));

这应该返回字符串

"(Intercept)=123.456 IndepVar1=25.456 IndepVar2=56.382"
于 2016-05-10T23:15:31.217 回答
1

您无需将模型本身转换为数据框即可返回 SQL。如果要将整个模型存储在数据库中,则可以在 R 中转换为原始向量并将其作为 T-SQL 中的 varbinary(max) 输出参数返回。或者,您可以从模型中提取单个组件,例如系数、误差作为单个/标量值并返回到 SQL。

这是一个将系数提取为数据框的示例:

    execute sp_execute_external_script
      @language = N'R'
    , @script = N'
irisModel <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width + Species, data = iris);
irisCoeff <- summary(irisModel)$coefficients;
OutputDataSet <- cbind(name = row.names(irisCoeff), data.frame(irisCoeff));
'
with result sets((Name nvarchar(100), "Estimate" float, "Std.Error" float, "t.value" float, "Pr.value" float))
于 2016-06-10T21:27:28.010 回答