2016-05-10 2 views
1

R-интеграция с SQL Server 2016 (CTP3): Я использую новый sp_execute_external_script для создания модели линейной регрессии. Есть ли способ отправить данные коэффициентов об обученной модели в output_data_1_name?Использование sp_execute_external_script, как я могу маршрутизировать метаданные обученной модели к output_data_1

Например, в теле 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, уровень 16, состояние 20, строка 0 Ошибка сценария «R» возникла во время выполнения «sp_execute_external_script» с HRESULT 0x80004004. Msg 39019, уровень 16, состояние 1, строка 0 Ошибка внешнего скрипта: Ошибка в as.data.frame.default (x [[i]], необязательный = ИСТИНА, строкиAsFactors = строкиAsFactors): не может принуждать класс "" summary.rxLinMod "" в data.frame Вызовы: source ... data.frame -> as.data.frame -> as.data.frame.default Ошибка в ScaleR. Проверьте вывод для получения дополнительной информации. Ошибка в eval (expr, envir, enclos): Ошибка в ScaleR. Проверьте вывод для получения дополнительной информации. Calls: Источник -> withVisible -> Eval -> Eval -> .call Выполнение остановлено Msg 11536, уровень 16, состояние 1, строка 2 EXECUTE заявление не удалось, поскольку его результатом НАБОРЫ положение указано 1 результирующего набора (ов) , но оператор только отправил 0 результирующих наборов во время выполнения.

Так что мне интересно, как получить этот выход из sp_execute_external_script в SQL. MSDN не покрывает много о самом R. SQL жалуется, что вывод из модели не может быть «принужден» к кадру данных. Мне интересно, какие манипуляции в R-Script можно сделать, чтобы «дразнить» его в dataframe.

+0

взглянуть на [MSDN] (https://msdn.microsoft.com/en-us/library/mt604368.aspx) – HubertL

+0

Благодарим вас за ответ Hubert.Да, я практически запомнил эту страницу, как и многие другие. Возможно, я нашел что-то близкое к решению. Вот что я имею в виду: –

ответ

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" 
+0

Спасибо HubertL !!!! –

+0

Это очень близко к тому, что мне нужно. Нам нужно поставить две одинарные кавычки вокруг знака равенства, которому присваивается sep. (он находится внутри текстовой строки) OutputDataSet <- data.frame (вставка (имена (коэффициенты Mymodel $), коэффициенты Mymodel $, sep = '' = '', collapse = "")); ', then on Набор результатов: С РЕЗУЛЬТАТОМ РЕЗУЛЬТАТОВ ((OutputDataSet nvarchar (max))) Я рассмотрю функции пасты и имен, чтобы увидеть, как добраться до метаданных модели сейчас. Большое спасибо!! –

+0

Добро пожаловать! – HubertL

0

Вам не нужно преобразовать модель в кадр данных в se, чтобы вернуться к SQL. Если вы хотите сохранить всю модель в базе данных, вы можете преобразовать ее в необработанный вектор в R и вернуть его в качестве выходного параметра varbinary (max) в T-SQL. В качестве альтернативы вы можете извлечь отдельные компоненты из модели, такие как коэффициенты, ошибки как индивидуальные/скалярные значения и вернуться к 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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^