Expandir scripts U-SQL com código R no Azure Data Lake Analytics

Importante

O Azure Data Lake Analytics descontinuado a 29 de fevereiro de 2024. Saiba mais com este anúncio.

Para análise de dados, a sua organização pode utilizar o Azure Synapse Analytics ou o Microsoft Fabric.

O exemplo seguinte ilustra os passos básicos para implementar o código R:

  • Utilize a REFERENCE ASSEMBLY instrução para ativar extensões R para o Script U-SQL.
  • Utilize a REDUCE operação para particionar os dados de entrada numa chave.
  • As extensões R para U-SQL incluem um redutor incorporado (Extension.R.Reducer) que executa código R em cada vértice atribuído ao redutor.
  • Utilização de frames de dados nomeados dedicados chamados inputFromUSQL e outputToUSQL , respetivamente, para transmitir dados entre U-SQL e R. Os nomes dos identificadores dataFrame de entrada e saída são fixos (ou seja, os utilizadores não podem alterar estes nomes predefinidos de identificadores dataFrame de entrada e saída).

Incorporar código R no script U-SQL

Pode inline o código R do script U-SQL com o parâmetro de comando do Extension.R.Reducer. Por exemplo, pode declarar o script R como uma variável de cadeia e transmiti-lo como um parâmetro para o Reducer.

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");

Mantenha o código R num ficheiro separado e faça referência ao script U-SQL

O exemplo seguinte ilustra uma utilização mais complexa. Neste caso, o código R é implementado como um RECURSO que é o script U-SQL.

Guarde este código R como um ficheiro separado.

load("my_model_LM_Iris.rda")
outputToUSQL=data.frame(predict(lm.fit, inputFromUSQL, interval="confidence"))

Utilize um script U-SQL para implementar esse script R com a instrução IMPLEMENTAR RECURSO.

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();

Como o R se integra no U-SQL

Tipos de dados

  • As colunas de cadeia e numéricas do U-SQL são convertidas tal como estão entre o R DataFrame e o U-SQL [tipos suportados: double, , stringbool, integer, byte].
  • O Factor tipo de dados não é suportado no U-SQL.
  • byte[] tem de ser serializado como uma codificação stringbase64 .
  • As cadeias U-SQL podem ser convertidas em fatores no código R, assim que o U-SQL criar um dataframe de entrada R ou ao definir o parâmetro stringsAsFactors: truede redução .

Esquemas

  • Os conjuntos de dados U-SQL não podem ter nomes de coluna duplicados.
  • Os nomes das colunas dos conjuntos de dados U-SQL têm de ser cadeias.
  • Os nomes das colunas têm de ser os mesmos em scripts U-SQL e R.
  • A coluna só de leitura não pode fazer parte do dataframe de saída. Uma vez que as colunas só de leitura são injetadas automaticamente na tabela U-SQL se fizer parte do esquema de saída do UDO.

Limitações funcionais

  • O Motor R não pode ser instanciado duas vezes no mesmo processo.
  • Atualmente, o U-SQL não suporta UDOs de Combinação para predição através de modelos particionados gerados com UDOs do Reducer. Os utilizadores podem declarar os modelos particionados como recurso e utilizá-los no respetivo Script R (ver código de exemplo ExtR_PredictUsingLMRawStringReducer.usql)

Versões R

Apenas o R 3.2.2 é suportado.

Módulos R Padrão

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

Limitações do tamanho da entrada e da saída

Cada vértice tem uma quantidade limitada de memória atribuída. Uma vez que os DataFrames de entrada e saída têm de existir na memória no código R, o tamanho total da entrada e saída não pode exceder os 500 MB.

Código de exemplo

Está disponível mais código de exemplo na sua conta do Data Lake Store depois de instalar as extensões de Análise avançada U-SQL. O caminho para mais código de exemplo é: <your_account_address>/usqlext/samples/R.

Implementar módulos R Personalizados com U-SQL

Primeiro, crie um módulo personalizado R e zipe-o e, em seguida, carregue o ficheiro de módulo personalizado zipado R para o seu arquivo do ADL. No exemplo, vamos carregar magittr_1.5.zip para a raiz da conta predefinida do ADLS para a conta do ADLA que estamos a utilizar. Depois de carregar o módulo para o arquivo do ADL, declare-o como utilizar IMPLEMENTAR RECURSO para o disponibilizar no script U-SQL e chamar install.packages para instalá-lo.

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();

Passos seguintes