Compartir a través de


Introducción a U-SQL en Azure Data Lake Analytics

Importante

Azure Data Lake Analytics se retiró el 29 de febrero de 2024. Obtenga más información con este anuncio.

Para el análisis de datos, su organización puede usar azure Synapse Analytics o Microsoft Fabric.

U-SQL es un lenguaje que combina SQL declarativo con C# imperativo para permitirle procesar datos a cualquier escala. A través de la funcionalidad escalable de consulta distribuida de U-SQL, puede analizar de forma eficaz los datos entre almacenes relacionales, como Azure SQL Database. Con U-SQL, puede procesar datos no estructurados aplicando esquema en la lectura e inserción de lógica personalizada y UDF. Además, U-SQL incluye extensibilidad que proporciona un control detallado sobre cómo ejecutarse a escala.

Recursos de aprendizaje

  • El tutorial de U-SQL proporciona un recorrido guiado por la mayoría del lenguaje U-SQL. Este documento se recomienda leer para todos los desarrolladores que quieran aprender U-SQL.
  • Para obtener información detallada sobre la sintaxis del lenguaje U-SQL de , vea la referencia del lenguaje U-SQL .
  • Para comprender la filosofía de diseño de U-SQL , consulte la entrada de blog de Visual Studio Introducción a U-SQL: un lenguaje que facilita el procesamiento de macrodatos.

Vamos a crear algunos datos

El siguiente script U-SQL es sencillo y nos permite crear un archivo de datos de ejemplo al que podemos hacer referencia en nuestros otros scripts U-SQL. Analizaremos los conceptos clave que hacen que este script vaya en la sección siguiente.

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

Leer datos de un archivo

Ahora que tenemos algunos datos, vamos a leerlo del archivo que hemos creado.

@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 no tiene ningún paso de transformación. Lee del archivo de origen denominado SearchLog.tsv, lo esquematiza y vuelve a escribir el conjunto de filas en un archivo denominado SearchLog-first-u-sql.csv.

Observe el signo de interrogación situado junto al tipo de datos en el campo Duration. Significa que el campo Duration podría ser NULL.

Conceptos clave

  • variables de conjunto de filas: cada expresión de consulta que genera un conjunto de filas se puede asignar a una variable. U-SQL sigue el patrón de nomenclatura de variables T-SQL (@searchlog, por ejemplo) en el script.
  • La palabra clave EXTRACT lee datos de un archivo y define el esquema al leer. Extractors.Tsv es un extractor U-SQL integrado para archivos de valores separados por tabulaciones. Puede desarrollar extractores personalizados.
  • El OUTPUT escribe datos de un conjunto de filas en un archivo. Outputters.Csv() es un outputter U-SQL integrado para crear un archivo de valores separados por comas. Puede desarrollar generadores de salida personalizados.

Rutas de archivos

Las instrucciones EXTRACT y OUTPUT usan rutas de acceso de archivo. Las rutas de acceso de archivo pueden ser absolutas o relativas:

Esta siguiente ruta de acceso de archivo absoluta hace referencia a un archivo de un almacén de Data Lake denominado mystore:

adl://mystore.azuredatalakestore.net/Samples/Data/SearchLog.tsv

Esta siguiente ruta de acceso de archivo comienza con "/". Hace referencia a un archivo en la cuenta predeterminada de Data Lake Store:

/output/SearchLog-first-u-sql.csv

Uso de variables escalares

También puede usar variables escalares para facilitar el mantenimiento del script. El script U-SQL anterior también se puede escribir 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();

Transformación de conjuntos de filas

Use SELECT para transformar conjuntos de filas. Este script seleccionará las columnas Inicio, Región y Duración, y escribirá esas filas en un archivo cuando Region tenga un 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();

La cláusula WHERE usa un expresión booleana de C#. Puede usar el lenguaje de expresiones de C# para realizar sus propias expresiones y funciones. Incluso puede realizar un filtrado más complejo al combinarlos con combinaciones lógicas (AND) y disjunciones (OR).

El siguiente script usa el método DateTime.Parse() y una conjunción. columnas Start, Region y Duration, donde Region tiene un valor de "en-gb". A continuación, comprueba si hay valores de la columna Duration entre determinadas fechas y escribe esos valores en un archivo:

@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:

La segunda consulta se aplica al resultado del primer conjunto de filas, lo que crea una combinación de los dos filtros. También puede reutilizar un nombre de variable, y los nombres tienen un ámbito léxico.

Conjuntos de filas agregados

U-SQL te ofrece las bien conocidas instrucciones ORDER BY, GROUP BY y las agregaciones.

La consulta siguiente busca la duración total por región y, a continuación, muestra las cinco duraciones principales en orden.

Los conjuntos de filas U-SQL no conservan su orden para la siguiente consulta. Por lo tanto, para ordenar una salida, debe agregar ORDER BY a la instrucción 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();

La cláusula ORDER BY de U-SQL requiere el uso de la cláusula FETCH en una expresión SELECT.

La cláusula HAVING de U-SQL se puede usar para restringir la salida a grupos que cumplen la condición 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 escenarios de agregación avanzados, consulte la documentación de referencia de U-SQL para funciones de agregado, análisis y referencia.

Pasos siguientes