Sql server 使用sp_execute_external_脚本,如何将经过训练的模型的元数据路由到输出_data_1
与SQL Server 2016 CTP3的R集成: 我正在使用新的sp_execute_external_脚本创建一个线性回归模型。是否有方法将训练模型的系数数据发送到输出数据名称 例如,在R脚本的主体中,如果您发出:printmyModel; 它在SSMS输出窗口中打印此信息,而不是输出数据:Sql server 使用sp_execute_external_脚本,如何将经过训练的模型的元数据路由到输出_data_1,sql-server,r,sql-server-2016,Sql Server,R,Sql Server 2016,与SQL Server 2016 CTP3的R集成: 我正在使用新的sp_execute_external_脚本创建一个线性回归模型。是否有方法将训练模型的系数数据发送到输出数据名称 例如,在R脚本的主体中,如果您发出:printmyModel; 它在SSMS输出窗口中打印此信息,而不是输出数据: Call: lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData) Coefficients: (Intercept)
Call:
lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData)
Coefficients:
(Intercept) IndepVar1 IndepVar2
123.456 25.456 56.382
是否有可能将其放入数据帧中?这会更好,因为我还想得到t值和R平方,并将其存储到一个表中。即使是varcharmax也可以。我会自己解析它
以下是我最近尝试的内容:
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,16级,状态20,第0行
执行“sp_execute_external_script”期间发生“R”脚本错误
使用HRESULT 0x80004004。
Msg 39019,16级,状态1,第0行
发生外部脚本错误:
as.data.frame.defaultx[[i]]中出错,可选=TRUE,stringsAsFactors=stringsAsFactors:
无法将类summary.rxLinMod强制为data.frame
电话:来源。。。data.frame->as.data.frame->as.data.frame.default
定标器出错。检查输出以了解更多信息。
evalexpr、envir、enclose中出错:
定标器出错。检查输出以了解更多信息。
调用:source->withVisible->eval->eval->。调用
停止执行
Msg 11536,16级,状态1,第2行
EXECUTE语句失败,因为指定了其WITH RESULT SETS子句
1个结果集,但该语句在运行时仅发送0个结果集
所以我想知道如何从SQL中的sp_execute_external_脚本中获得输出。MSDN并没有涵盖太多关于R本身的内容。SQL抱怨模型的输出不能强制到数据帧。我想知道在R脚本中可以做什么操作来将其梳理成数据帧。如果您想获得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)));
您不需要将模型本身转换为数据帧来返回SQL。如果希望将整个模型存储在数据库中,则可以转换为R中的原始向量,并将其作为T-SQL中的varbinarymax输出参数返回。或者,您可以从模型中提取单个组件(如系数),将错误作为单个/标量值,然后返回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))
看看谢谢你的回复,休伯特。是的,我几乎记住了那一页,还有很多其他的。我可能已经找到了接近解决这个问题的办法。这就是我要处理的:这非常接近我所需要的。我们确实需要在sep的等号周围加上两个单引号。它位于文本字符串OutputDataSet中。为什么必须将字符串转换为data.frame?
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))