2016-06-23 1 views
2

J'essaie de convertir un script scaleR en T-SQL (avec exécution external_script) pour les analyses R dans la base de données dans SQL Server. Le script scaleR avec lequel je travaille est sur le DeepDive Data Science Tutorial on Fraud data by MSDN.

Toutes mes données sont dans SQL Server maintenant (à partir du tutoriel), et tout ce que je veux faire est d'interroger cette table pour obtenir un résumé en utilisant la fonction scaleR rxSummary (in-database).
C'est ma tentative:T-SQL avec exécution de script externe pour l'intégration de R dans la base de données

exec sp_execute_external_script 
@language = N'R', 
@script = N' 
sumOut <- rxSummary( 
formula = ~gender + balance + numTrans + numIntlTrans + creditLine, 
data = ccFraud 
) 
', 
@input_data_1 = N'select * from [DeepDive].[db_datareader].[ccFraudSmall]', 
@input_data_1_name = N'ccFraud', 
@output_data_1_name = N'summary' 
with result sets ((summary varchar(max) not null)); 

Mais renvoie une erreur:

STDOUT message(s) from external script: 
Rows Read: 10000, Total Rows Processed: 10000, Total Chunk Time: Less than .001 seconds 
Computation time: 0.000 seconds. 
Msg 11536, Level 16, State 1, Line 5 
EXECUTE statement failed because its WITH RESULT SETS clause specified 1 result set(s), but the statement only sent 0 result set(s) at run time. 

Toute idée comment faire face à cela?

Ai-je manqué une étape?

Répondre

1

Dans votre exemple, il existe une discordance entre le script R et les définitions de paramètres SQL. La valeur du paramètre output_data_1_name spécifie le nom de la structure de données R qui est renvoyée de R vers SQL Server. Mais aucune valeur n'est affectée à summary dans le script R. Par conséquent, vous obtenez une erreur 0 résultats. Voir sp_execute_external_script document pour la description et l'exemple.

Si vous essayez simplement d'afficher le résumé sous forme de messages, vous pouvez ajouter print(sumOut) au script R.

Si vous souhaitez renvoyer des données à SQL Server, vous devez créer une image R et l'attribuer au output_1_data.

+0

Merci, cela a fonctionné pour afficher les résultats récapitulatifs. Mais quand je veux enregistrer Summary to SQL Server, j'ai essayé d'ajouter 'summary <- data.frame (sumOut)' au script R, il génère une erreur que rxSummary ne peut pas être forcé dans une trame de données. – Raj

+0

Essayez-vous de stocker l'objet rxSummary en tant que binaire dans SQL Server? Essayez d'utiliser 'résumé <- serialize (sumOut, NULL);' –

+0

C'est mon code maintenant: '@script = N » \t \t \t \t sumOut <- rxSummary ( \t \t \t \t \t \t \t \t \t formule = ~ sexe + balance + NUMTrans + numIntlTrans + Creditline, \t \t \t \t \t \t \t \t \t data = ccFraud \t \t \t \t \t \t \t \t \t) \t \t \t \t impression (sumOut) \t \t \t \t résumé <- serialize (sumOut, NULL); \t \t \t \t », \t @ input_data_1 = N'select * de [scaphandrier]. [Db_datareader].[CcFraud10] ' \t @ input_data_1_name = N'ccFraud', \t @ output_data_1_name = N'summary » \t avec des ensembles de résultats ((résumé varbinary (max) non null));' montre cette erreur: _La l'ensemble de données de sortie doit être de type trame de données; pensez à utiliser data.frame() pour le convertir._ – Raj