Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用sp_execute_external_脚本,如何将经过训练的模型的元数据路由到输出_data_1_Sql Server_R_Sql Server 2016 - Fatal编程技术网

Sql server 使用sp_execute_external_脚本,如何将经过训练的模型的元数据路由到输出_data_1

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)

与SQL Server 2016 CTP3的R集成: 我正在使用新的sp_execute_external_脚本创建一个线性回归模型。是否有方法将训练模型的系数数据发送到输出数据名称

例如,在R脚本的主体中,如果您发出:printmyModel; 它在SSMS输出窗口中打印此信息,而不是输出数据:

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))