Introdução ao U-SQL 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 U-SQL é uma linguagem que combina SQL declarativo com C# imperativo para lhe permitir processar dados em qualquer escala. Através da capacidade de consulta distribuída dimensionável do U-SQL, pode analisar dados de forma eficiente em arquivos relacionais, como SQL do Azure Base de Dados. Com o U-SQL, pode processar dados não estruturados ao aplicar o esquema na leitura e inserção de lógica personalizada e UDFs. Além disso, o U-SQL inclui extensibilidade que lhe dá controlo detalhado sobre como executar em escala.
Recursos de aprendizagem
- O Tutorial de U-SQL fornece instruções guiadas da maior parte da linguagem U-SQL. Este documento é uma leitura recomendada para todos os programadores que pretendam aprender U-SQL.
- Para obter informações detalhadas sobre a sintaxe da linguagem U-SQL, veja Referência de Linguagem U-SQL.
- Para compreender a filosofia de design U-SQL, veja a publicação de blogue do Visual Studio Introducing U-SQL – A Language that makes Big Data Processing Easy (Introdução ao U-SQL – Uma Linguagem que facilita o Processamento de Macrodados).
Vamos criar alguns dados
O seguinte script U-SQL é simples e permite-nos criar um ficheiro de dados de exemplo que podemos referenciar nos nossos outros scripts U-SQL. Vamos abordar os principais conceitos que fazem com que este script avance na secção seguinte.
USE DATABASE master;
USE SCHEMA dbo;
@a =
SELECT * FROM
(VALUES
(399266, "2/15/2012 11:53:16 AM", "en-us", "microsoft", 73, "microsoft.com;xbox.com", "NULL"),
(382045, "2/15/2012 11:53:18 AM", "en-gb", "azure data lake analytics", 614, "microsoft.com;portal.azure.com", "portal.azure.com"),
(382045, "2/16/2012 11:53:20 AM", "en-gb", "usql", 74, "microsoft.com;github.com", "NULL"),
(106479, "2/16/2012 11:53:50 AM", "en-ca", "xbox", 24, "xbox.com;xbox.com/xbox360", "xbox.com/xbox360"),
(906441, "2/16/2012 11:54:01 AM", "en-us", "machine learning", 1213, "microsoft.com;github.com", "NULL"),
(304305, "2/16/2012 11:54:03 AM", "en-us", "outlook", 60, "microsoft.com;office.com;live.com","microsoft.com"),
(460748, "2/16/2012 11:54:04 AM", "en-us", "azure storage", 1270, "microsoft.com;portal.azure.com", "portal.azure.com"),
(354841, "2/16/2012 11:59:01 AM", "en-us", "azure", 610, "microsoft.com;portal.azure.com", "portal.azure.com"),
(354068, "2/16/2012 12:00:33 PM", "en-mx", "key vault", 422, "microsoft.com;portal.azure.com", "portal.azure.com"),
(347413, "2/16/2012 12:11:55 PM", "en-gr", "github", 305, "github.com", "NULL"),
(840614, "2/16/2012 12:13:56 PM", "en-us", "surface", 1220, "microsoft.com", "NULL"),
(656666, "2/16/2012 12:15:55 PM", "en-us", "visual studio", 691, "microsoft.com;code.visualstudio.com", "NULL"),
(951513, "2/16/2012 12:17:00 PM", "en-us", "power bi", 63, "microsoft.com;app.powerbi.com", "powerbi.com"),
(350350, "2/16/2012 12:18:17 PM", "en-us", "data factory", 30, "microsoft.com;portal.azure.com", "NULL"),
(641615, "2/16/2012 12:19:55 PM", "en-us", "event hubs", 119, "microsoft.com;portal.azure.com", "NULL")
) AS
D( UserId, Start, Region, Query, Duration, Urls, ClickedUrls );
OUTPUT @a
TO "Samples/Data/SearchLog.tsv"
USING Outputters.Tsv();
Ler dados de um ficheiro
Agora que temos alguns dados, vamos lê-lo a partir do ficheiro que criámos.
@searchlog =
EXTRACT UserId int,
Start DateTime,
Region string,
Query string,
Duration int?,
Urls string,
ClickedUrls string
FROM "/Samples/Data/SearchLog.tsv"
USING Extractors.Tsv();
OUTPUT @searchlog
TO "/output/SearchLog-first-u-sql.csv"
USING Outputters.Csv();
Este script não tem passos de transformação. Lê a partir do ficheiro de origem denominado SearchLog.tsv
, esquematiza-o e escreve o conjunto de linhas num ficheiro chamado SearchLog-first-u-sql.csv.
Repare no ponto de interrogação junto ao tipo de dados no Duration
campo. Significa que o Duration
campo pode ser nulo.
Conceitos-chave
-
Variáveis de conjunto de linhas: cada expressão de consulta que produz um conjunto de linhas pode ser atribuída a uma variável. O U-SQL segue o padrão de nomenclatura da variável T-SQL (
@searchlog
por exemplo) no script. - A palavra-chave EXTRACT lê os dados de um ficheiro e define o esquema na leitura.
Extractors.Tsv
é um extrator U-SQL incorporado para ficheiros de valores separados por tabulações. Pode desenvolver extratores personalizados. - O OUTPUT escreve dados de um conjunto de linhas num ficheiro.
Outputters.Csv()
é um outputter U-SQL incorporado para criar um ficheiro de valores separados por vírgulas. Pode desenvolver saídas personalizadas.
Caminhos de ficheiro
As instruções EXTRACT e OUTPUT utilizam caminhos de ficheiro. Os caminhos dos ficheiros podem ser absolutos ou relativos:
Este seguinte caminho de ficheiro absoluto refere-se a um ficheiro num Data Lake Store com o nome mystore
:
adl://mystore.azuredatalakestore.net/Samples/Data/SearchLog.tsv
Este caminho de ficheiro seguinte começa com "/"
. Refere-se a um ficheiro na conta predefinida do Data Lake Store:
/output/SearchLog-first-u-sql.csv
Utilizar variáveis escalares
Também pode utilizar variáveis escalares para facilitar a manutenção do script. O script U-SQL anterior também pode ser escrito como:
DECLARE @in string = "/Samples/Data/SearchLog.tsv";
DECLARE @out string = "/output/SearchLog-scalar-variables.csv";
@searchlog =
EXTRACT UserId int,
Start DateTime,
Region string,
Query string,
Duration int?,
Urls string,
ClickedUrls string
FROM @in
USING Extractors.Tsv();
OUTPUT @searchlog
TO @out
USING Outputters.Csv();
Transformar conjuntos de linhas
Utilize SELECT para transformar conjuntos de linhas. Este script irá selecionar as colunas Iniciar, Região e Duração e irá escrever essas linhas num ficheiro quando Região tiver um valor de "en-gb":
@searchlog =
EXTRACT UserId int,
Start DateTime,
Region string,
Query string,
Duration int?,
Urls string,
ClickedUrls string
FROM "/Samples/Data/SearchLog.tsv"
USING Extractors.Tsv();
@rs1 =
SELECT Start, Region, Duration
FROM @searchlog
WHERE Region == "en-gb";
OUTPUT @rs1
TO "/output/SearchLog-transform-rowsets.csv"
USING Outputters.Csv();
A cláusula WHERE utiliza uma expressão booleana C#. Pode utilizar a linguagem de expressão C# para efetuar as suas próprias expressões e funções. Pode até efetuar filtragem mais complexa ao combiná-las com conjunções lógicas (ANDs) e disjunções (ROs).
O script seguinte utiliza o método DateTime.Parse() e uma conjunção. colunas Início, Região e Duração, em que Região tem um valor de "en-gb". Em seguida, verifica os valores da coluna Duração entre determinadas datas e escreve esses valores num ficheiro:
@searchlog =
EXTRACT UserId int,
Start DateTime,
Region string,
Query string,
Duration int?,
Urls string,
ClickedUrls string
FROM "/Samples/Data/SearchLog.tsv"
USING Extractors.Tsv();
@rs1 =
SELECT Start, Region, Duration
FROM @searchlog
WHERE Region == "en-gb";
@rs1 =
SELECT Start, Region, Duration
FROM @rs1
WHERE Start >= DateTime.Parse("2012/02/16") AND Start <= DateTime.Parse("2012/02/17");
OUTPUT @rs1
TO "/output/SearchLog-transform-datetime.csv"
USING Outputters.Csv();
Nota
A segunda consulta está a funcionar no resultado do primeiro conjunto de linhas, o que cria um composto dos dois filtros. Também pode reutilizar um nome de variável e os nomes estão no âmbito lexicamente.
Agregar conjuntos de linhas
O U-SQL fornece-lhe as agregações ORDER BY, GROUP BY e familiares.
A consulta seguinte localiza a duração total por região e, em seguida, apresenta as cinco principais durações por ordem.
Os conjuntos de linhas U-SQL não preservam a respetiva ordem para a consulta seguinte. Assim, para ordenar uma saída, tem de adicionar ORDER BY à instrução OUTPUT:
DECLARE @outpref string = "/output/Searchlog-aggregation";
DECLARE @out1 string = @outpref+"_agg.csv";
DECLARE @out2 string = @outpref+"_top5agg.csv";
@searchlog =
EXTRACT UserId int,
Start DateTime,
Region string,
Query string,
Duration int?,
Urls string,
ClickedUrls string
FROM "/Samples/Data/SearchLog.tsv"
USING Extractors.Tsv();
@rs1 =
SELECT
Region,
SUM(Duration) AS TotalDuration
FROM @searchlog
GROUP BY Region;
@res =
SELECT *
FROM @rs1
ORDER BY TotalDuration DESC
FETCH 5 ROWS;
OUTPUT @rs1
TO @out1
ORDER BY TotalDuration DESC
USING Outputters.Csv();
OUTPUT @res
TO @out2
ORDER BY TotalDuration DESC
USING Outputters.Csv();
A cláusula U-SQL ORDER BY requer a utilização da cláusula FETCH numa expressão SELECT.
A cláusula HAVING do U-SQL pode ser utilizada para restringir a saída a grupos que satisfaçam a condição HAVING:
@searchlog =
EXTRACT UserId int,
Start DateTime,
Region string,
Query string,
Duration int?,
Urls string,
ClickedUrls string
FROM "/Samples/Data/SearchLog.tsv"
USING Extractors.Tsv();
@res =
SELECT
Region,
SUM(Duration) AS TotalDuration
FROM @searchlog
GROUP BY Region
HAVING SUM(Duration) > 200;
OUTPUT @res
TO "/output/Searchlog-having.csv"
ORDER BY TotalDuration DESC
USING Outputters.Csv();
Para cenários de agregação avançados, veja a documentação de referência do U-SQL para funções de agregação, análise e referência.