Compartilhar via


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

Importante

O Azure Data Lake Analytics se aposentou em 29 de fevereiro de 2024. Saiba mais com este 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 o código R:

  • Use a REFERENCE ASSEMBLY instrução para habilitar extensões de R para o Script U-SQL.
  • Use a REDUCE operação para particionar os dados de entrada em uma chave.
  • As extensões de 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 do identificador 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 o código R no script U-SQL

Você pode embutido o código R do 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 referenciá-lo ao 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 ao U-SQL

Tipos de dados

  • As colunas de cadeia de caracteres e numéricas do U-SQL são convertidas as-is entre R DataFrame e U-SQL [tipos com suporte: double, , string, bool, integerbyte].
  • O tipo de dados Factor não é suportado no U-SQL.
  • byte[] deve ser serializado como um string codificado em base64.
  • Cadeias de caracteres U-SQL podem ser convertidas em fatores no código R, depois que U-SQL criar o dataframe de entrada R, ou ao definir o parâmetro redutor.

Esquemas

  • Os conjuntos de dados U-SQL não podem ter nomes de coluna duplicados.
  • Os nomes de colunas de conjuntos de dados U-SQL devem ser cadeias de caracteres.
  • Os nomes de coluna devem ser os mesmos em scripts U-SQL e R.
  • A coluna Readonly não pode fazer parte do dataframe de saída. Como as colunas somente leitura são automaticamente injetadas de volta na tabela U-SQL se ela faz 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 combinados para previsão usando modelos particionados gerados usando UDOs do Redutor. Os usuários podem declarar os modelos particionados como recurso e usá-los em seu Script R (consulte o código de exemplo ExtR_PredictUsingLMRawStringReducer.usql)

Versões do R

Há suporte apenas para R 3.2.2.

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 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 que você instala as extensões da Análise Avançada do U-SQL. O caminho para mais código de exemplo é: <your_account_address>/usqlext/samples/R.

Implantando módulos R personalizados com U-SQL

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