使用 sp_execute_external_script,如何将经过训练的模型的元数据路由到 output_data_1
Using sp_execute_external_script, how can I route the metadata of a trained model to output_data_1
R-集成到 SQL Server 2016 (CTP3):
我正在使用新的 sp_execute_external_script 创建线性回归模型。有没有办法将有关训练模型的系数数据发送到 output_data_1_name?
例如,在 R 脚本的主体中,如果您发出:print(myModel);
它在 SSMS 输出中打印此 window(不是 output_data):
Call:
lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData)
Coefficients:
(Intercept) IndepVar1 IndepVar2
123.456 25.456 56.382
是否可以将其放入数据框中?那会更好,因为我还想获取 t 值和 R 平方并将其存储到 table。即使是 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) 错误:
无法将 class“"summary.rxLinMod"”强制转换为 data.frame
调用:source ... data.frame -> as.data.frame -> as.data.frame.default
ScaleR 中的错误。检查输出以获取更多信息。
eval(expr, envir, enclos) 错误:
ScaleR 中的错误。检查输出以获取更多信息。
调用:source -> withVisible -> eval -> eval -> .Call
执行暂停
消息 11536,级别 16,状态 1,第 2 行
EXECUTE 语句失败,因为指定了它的 WITH RESULT SETS 子句
1 个结果集,但语句在 运行 时间只发送了 0 个结果集。
所以我想知道如何从 SQL 中的 sp_execute_external_script 中获取输出。 MSDN 对 R 本身的介绍不多。 SQL 抱怨模型的输出不能 "coerced" 到数据框。我想知道可以在 R 脚本中进行哪些操作以将其 "tease" 放入数据帧中。
如果你想获得 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)));
这应该 return 字符串
"(Intercept)=123.456 IndepVar1=25.456 IndepVar2=56.382"
您不需要将模型转换为数据框本身到 return 到 SQL。如果你想将整个模型存储在数据库中,那么你可以在 R 中转换为原始向量并 return 它作为 T-SQL 中的 varbinary(max) 输出参数。或者,您可以从模型中提取单个组件,例如系数、作为单个/标量值的误差以及 return 到 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))
R-集成到 SQL Server 2016 (CTP3): 我正在使用新的 sp_execute_external_script 创建线性回归模型。有没有办法将有关训练模型的系数数据发送到 output_data_1_name?
例如,在 R 脚本的主体中,如果您发出:print(myModel); 它在 SSMS 输出中打印此 window(不是 output_data):
Call:
lm(formula = DepVar ~ IndepVar1 + IndepVar2, data = myDemoData)
Coefficients:
(Intercept) IndepVar1 IndepVar2
123.456 25.456 56.382
是否可以将其放入数据框中?那会更好,因为我还想获取 t 值和 R 平方并将其存储到 table。即使是 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) 错误: 无法将 class“"summary.rxLinMod"”强制转换为 data.frame 调用:source ... data.frame -> as.data.frame -> as.data.frame.default ScaleR 中的错误。检查输出以获取更多信息。 eval(expr, envir, enclos) 错误: ScaleR 中的错误。检查输出以获取更多信息。 调用:source -> withVisible -> eval -> eval -> .Call 执行暂停 消息 11536,级别 16,状态 1,第 2 行 EXECUTE 语句失败,因为指定了它的 WITH RESULT SETS 子句 1 个结果集,但语句在 运行 时间只发送了 0 个结果集。
所以我想知道如何从 SQL 中的 sp_execute_external_script 中获取输出。 MSDN 对 R 本身的介绍不多。 SQL 抱怨模型的输出不能 "coerced" 到数据框。我想知道可以在 R 脚本中进行哪些操作以将其 "tease" 放入数据帧中。
如果你想获得 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)));
这应该 return 字符串
"(Intercept)=123.456 IndepVar1=25.456 IndepVar2=56.382"
您不需要将模型转换为数据框本身到 return 到 SQL。如果你想将整个模型存储在数据库中,那么你可以在 R 中转换为原始向量并 return 它作为 T-SQL 中的 varbinary(max) 输出参数。或者,您可以从模型中提取单个组件,例如系数、作为单个/标量值的误差以及 return 到 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))