Rozšíření U-SQL skriptů pomocí kódu R v Azure Data Lake Analytics
Následující příklad ukazuje základní kroky pro nasazení kódu jazyka R:
- Pomocí příkazu povolte rozšíření jazyka
REFERENCE ASSEMBLY
R pro U-SQL Script. REDUCE
Pomocí operace rozdělte vstupní data na klíč.- Rozšíření R pro U-SQL zahrnují integrovaný reduktor (
Extension.R.Reducer
), který spouští kód R na každém vrcholu přiřazeného reduktoru. - Použití vyhrazených pojmenovaných datových rámců volaných
inputFromUSQL
aoutputToUSQL
v uvedeném pořadí pro předávání dat mezi U-SQL a R. Názvy identifikátorů vstupního a výstupního datového rámce jsou pevné (to znamená, že uživatelé nemohou změnit tyto předdefinované názvy vstupních a výstupních identifikátorů datového rámce).
Vložení kódu R do skriptu U-SQL
Kód jazyka R můžete vložit do skriptu U-SQL pomocí parametru Extension.R.Reducer
příkazu . Můžete například deklarovat skript R jako řetězcovou proměnnou a předat ho jako parametr Reduceru.
REFERENCE ASSEMBLY [ExtR];
DECLARE @myRScript = @"
inputFromUSQL$Species = as.factor(inputFromUSQL$Species)
lm.fit=lm(unclass(Species)~.-Par, data=inputFromUSQL)
#do not return readonly columns and make sure that the column names are the same in usql and r cripts,
outputToUSQL=data.frame(summary(lm.fit)$coefficients)
colnames(outputToUSQL) <- c(""Estimate"", ""StdError"", ""tValue"", ""Pr"")
outputToUSQL
";
@RScriptOutput = REDUCE … USING new Extension.R.Reducer(command:@myRScript, ReturnType:"dataframe");
Ponechte kód jazyka R v samostatném souboru a odkazujte na něj U-SQL skript.
Následující příklad ukazuje složitější použití. V tomto případě se kód R nasadí jako prostředek, který je U-SQL skriptem.
Uložte tento kód R jako samostatný soubor.
load("my_model_LM_Iris.rda")
outputToUSQL=data.frame(predict(lm.fit, inputFromUSQL, interval="confidence"))
Pomocí skriptu U-SQL nasaďte tento skript R pomocí příkazu DEPLOY RESOURCE.
REFERENCE ASSEMBLY [ExtR];
DEPLOY RESOURCE @"/usqlext/samples/R/RinUSQL_PredictUsingLinearModelasDF.R";
DEPLOY RESOURCE @"/usqlext/samples/R/my_model_LM_Iris.rda";
DECLARE @IrisData string = @"/usqlext/samples/R/iris.csv";
DECLARE @OutputFilePredictions string = @"/my/R/Output/LMPredictionsIris.txt";
DECLARE @PartitionCount int = 10;
@InputData =
EXTRACT
SepalLength double,
SepalWidth double,
PetalLength double,
PetalWidth double,
Species string
FROM @IrisData
USING Extractors.Csv();
@ExtendedData =
SELECT
Extension.R.RandomNumberGenerator.GetRandomNumber(@PartitionCount) AS Par,
SepalLength,
SepalWidth,
PetalLength,
PetalWidth
FROM @InputData;
// Predict Species
@RScriptOutput = REDUCE @ExtendedData ON Par
PRODUCE Par, fit double, lwr double, upr double
READONLY Par
USING new Extension.R.Reducer(scriptFile:"RinUSQL_PredictUsingLinearModelasDF.R", rReturnType:"dataframe", stringsAsFactors:false);
OUTPUT @RScriptOutput TO @OutputFilePredictions USING Outputters.Tsv();
Integrace R s U-SQL
Datové typy
- Řetězcové a číselné sloupce z U-SQL jsou převedeny jako mezi datovým rámcem R a U-SQL [podporované typy:
double
, ,string
bool
,integer
,byte
]. - Datový
Factor
typ není v U-SQL podporován. byte[]
musí být serializován jako base64 kódovanýstring
.- U-SQL řetězce lze v kódu R převést na faktory, jakmile U-SQL vytvořit vstupní datový rámec R nebo nastavením parametru redukčního nástroje
stringsAsFactors: true
.
Schémata
- U-SQL datové sady nemohou mít duplicitní názvy sloupců.
- U-SQL názvy sloupců datových sad musí být řetězce.
- Názvy sloupců musí být stejné ve skriptech U-SQL a R.
- Sloupec jen pro čtení nemůže být součástí výstupního datového rámce. Vzhledem k tomu, že sloupce jen pro čtení se automaticky vloží zpět do tabulky U-SQL, pokud je součástí výstupního schématu UDO.
Funkční omezení
- Modul R nelze vytvořit instanci dvakrát ve stejném procesu.
- V současné době U-SQL nepodporuje kombinační objekty definované uživatelem pro predikci pomocí dělených modelů generovaných pomocí objektů definované uživatelem redukce. Uživatelé můžou deklarovat dělené modely jako prostředek a používat je ve skriptu R (viz ukázkový kód
ExtR_PredictUsingLMRawStringReducer.usql
).
Verze jazyka R
Podporuje se jenom R 3.2.2.
Standardní moduly R
base
boot
Class
Cluster
codetools
compiler
datasets
doParallel
doRSR
foreach
foreign
Graphics
grDevices
grid
iterators
KernSmooth
lattice
MASS
Matrix
Methods
mgcv
nlme
Nnet
Parallel
pkgXMLBuilder
RevoIOQ
revoIpe
RevoMods
RevoPemaR
RevoRpeConnector
RevoRsrConnector
RevoScaleR
RevoTreeView
RevoUtils
RevoUtilsMath
Rpart
RUnit
spatial
splines
Stats
stats4
survival
Tcltk
Tools
translations
utils
XML
Omezení velikosti vstupu a výstupu
Každý vrchol má přiřazenou omezenou velikost paměti. Vzhledem k tomu, že vstupní a výstupní datové rámce musí existovat v paměti v kódu R, celková velikost vstupu a výstupu nesmí překročit 500 MB.
Ukázka kódu
Další ukázkový kód je k dispozici v účtu Data Lake Store po instalaci rozšíření U-SQL Advanced Analytics. Cesta pro více vzorového kódu je: <your_account_address>/usqlext/samples/R
.
Nasazení vlastních modulů R s využitím U-SQL
Nejprve vytvořte vlastní modul R a zazipujte ho a pak nahrajte soubor vlastního modulu zip R do úložiště ADL. V tomto příkladu nahrajeme magittr_1.5.zip do kořenového adresáře výchozího účtu ADLS pro účet ADLA, který používáme. Jakmile modul nahrajete do úložiště ADL, deklarujte ho jako prostředek DEPLOY, aby byl dostupný ve vašem U-SQL skriptu a volal install.packages
ho k instalaci.
REFERENCE ASSEMBLY [ExtR];
DEPLOY RESOURCE @"/magrittr_1.5.zip";
DECLARE @IrisData string = @"/usqlext/samples/R/iris.csv";
DECLARE @OutputFileModelSummary string = @"/R/Output/CustomPackages.txt";
// R script to run
DECLARE @myRScript = @"
# install the magrittr package,
install.packages('magrittr_1.5.zip', repos = NULL),
# load the magrittr package,
require(magrittr),
# demonstrate use of the magrittr package,
2 %>% sqrt
";
@InputData =
EXTRACT SepalLength double,
SepalWidth double,
PetalLength double,
PetalWidth double,
Species string
FROM @IrisData
USING Extractors.Csv();
@ExtendedData =
SELECT 0 AS Par,
*
FROM @InputData;
@RScriptOutput = REDUCE @ExtendedData ON Par
PRODUCE Par, RowId int, ROutput string
READONLY Par
USING new Extension.R.Reducer(command:@myRScript, rReturnType:"charactermatrix");
OUTPUT @RScriptOutput TO @OutputFileModelSummary USING Outputters.Tsv();