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 a outputToUSQL 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.Reducerpří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, , stringbool, 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();

Další kroky