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

Importante

O Azure Data Lake Analytics desativado em 29 de fevereiro de 2024. Saiba mais nesse comunicado.

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

O exemplo a seguir ilustra as etapas básicas para implantar código R:

  • Use a instrução REFERENCE ASSEMBLY para habilitar as extensões R para o Script U-SQL.
  • Use a REDUCE operação para a partição dos dados de entrada em uma chave.
  • As extensões R para U-SQL incluem um redutor interno (Extension.R.Reducer) que executa o código R em cada vértice atribuído ao redutor.
  • Uso de quadros de dados nomeados dedicados chamados inputFromUSQL e outputToUSQL , respectivamente, para passar dados entre U-SQL e R. Os nomes de identificador de DataFrame de entrada e saída são fixos (ou seja, os usuários não podem alterar esses nomes predefinidos de identificadores dataframe de entrada e saída).

Inserindo código R no script U-SQL

Você pode embutir o código R no script U-SQL usando o parâmetro de comando do Extension.R.Reducer. Por exemplo, você pode declarar o script R como uma variável de cadeia de caracteres e passá-lo como um parâmetro para o Redutor.

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

Manter o código R em um arquivo separado e fazer referência a ela no script U-SQL

O exemplo a seguir ilustra um uso mais complexo. Nesse caso, o código R é implantado como um RESOURCE que é o script U-SQL.

Salve esse código R como um arquivo separado.

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

Use um script U-SQL para implantar esse script R com a instrução 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();

Como o R se integra com o U-SQL

Tipos de dados

  • As colunas numéricas e de cadeia de caracteres do U-SQL são convertidas no estado em que se encontram entre R DataFrame e U-SQL [tipos com suporte: double, string, bool, integer, byte].
  • Não Factor há suporte para o tipo de dados no U-SQL.
  • byte[] deve ser serializado como uma string codificada em base64.
  • As cadeias de caracteres de U-SQL poderão ser convertidas em fatores no código R depois que U-SQL criar quadro de dados de entrada R ou configurando o parâmetro redutor stringsAsFactors: true.

Esquemas

  • Os conjuntos de dados U-SQL não podem ter nomes de coluna duplicados.
  • Nomes de coluna de conjuntos de dados U-SQL devem ser cadeias de caracteres.
  • Nomes de coluna devem ser iguais em scripts U-SQL e R.
  • A coluna somente leitura não pode fazer parte do dataframe de saída. Como as colunas somente leitura são injetadas automaticamente na tabela U-SQL se elas fazem parte do esquema de saída do UDO.

Limitações funcionais

  • O mecanismo R não pode ser instanciado duas vezes no mesmo processo.
  • Atualmente, o U-SQL não dá suporte a UDOs combinadores para previsão usando modelos particionados gerados usando UDOs do Redutor. Os usuários podem declarar os modelos particionados como recurso e usá-los no Script de R (consulte o código de exemplo ExtR_PredictUsingLMRawStringReducer.usql)

Versões do R

Somente o R 3.2.2 tem suporte.

Módulos de 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 de tamanho de Entrada e Saída

Cada vértice tem uma quantidade limitada de memória atribuída a ele. Como os DataFrames de entrada e saída devem existir na memória no código R, o tamanho total da entrada e da saída não pode exceder 500 MB.

Código de exemplo

Mais código de exemplo está disponível em sua conta do Data Lake Store depois de você instalar as Extensões de Análise Avançada do U-SQL. O caminho para mais código de exemplo é: <your_account_address>/usqlext/samples/R.

Implantar módulos R personalizados com o U-SQL

Primeiro, crie um módulo R personalizado, compacte-o e, em seguida, carregue o arquivo de módulo R personalizado compactado em seu repositório do ADL. No exemplo, carregaremos magittr_1.5.zip na raiz da conta padrão do ADLS para a conta do ADLA que estamos usando. Depois que você carregar o módulo no repositório do ADL, declare-o e use DEPLOY RESOURCE para disponibilizá-lo em seu script U-SQL e chame 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();

Próximas etapas