R-Integration到SQL Server 2016(CTP3): 我正在使用新的sp_execute_external_script来创建线性回归模型。有没有办法将有关训练模型的系数数据发送到output_data_1_name?
例如,在R-Script的正文中,如果你发出: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中遇到的错误是:
Msg 39004,Level 16,State 20,Line 0 执行'sp_execute_external_script'期间发生'R'脚本错误 使用HRESULT 0x80004004。 消息39019,级别16,状态1,行0 发生外部脚本错误: as.data.frame.default(x [[i]],optional = TRUE,stringsAsFactors = stringsAsFactors)出错: 不能强制类“”summary.rxLinMod“”强制到data.frame 电话:来源... data.frame - &gt; as.data.frame - &gt; as.data.frame.default ScaleR出错。检查输出以获取更多信息。 eval中的错误(expr,envir,enclos): ScaleR出错。检查输出以获取更多信息。 电话:来源 - &gt; withVisible - &gt; eval - &gt; eval - &gt; 。呼叫 执行停止 Msg 11536,Level 16,State 1,Line 2 EXECUTE语句失败,因为它指定了WITH RESULT SETS子句 1个结果集,但该语句仅在运行时发送了0个结果集。
所以我想知道如何从SQL中的sp_execute_external_script中获取该输出。 MSDN并未涵盖R本身。 SQL抱怨说模型的输出不能“强制”到数据帧。我想知道R-Script中的哪些操作可以将其“取笑”成数据帧。
答案 0 :(得分:1)
如果您想获得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"
答案 1 :(得分:0)
您不需要将模型转换为数据框本身以返回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))