Wprowadzenie do języka U-SQL w usłudze Azure Data Lake Analytics

Ważne

Usługa Azure Data Lake Analytics została wycofana 29 lutego 2024 r. Dowiedz się więcej z tym ogłoszeniem.

W przypadku analizy danych organizacja może używać Azure Synapse Analytics lub Microsoft Fabric.

U-SQL to język, który łączy deklaratywny język SQL z imperatywnego języka C#, aby umożliwić przetwarzanie danych na dowolnej skali. Dzięki skalowalnej, rozproszonej funkcji zapytań U-SQL można efektywnie analizować dane w magazynach relacyjnych, takich jak Azure SQL Database. Za pomocą języka U-SQL można przetwarzać dane bez struktury, stosując schemat do odczytu i wstawiania niestandardowej logiki i funkcji zdefiniowanych przez użytkownika. Ponadto język U-SQL obejmuje rozszerzalność, która zapewnia szczegółową kontrolę nad sposobem wykonywania na dużą skalę.

Zasoby szkoleniowe

Utwórzmy dane

Poniższy skrypt U-SQL jest prosty i umożliwia utworzenie przykładowego pliku danych, do którego możemy się odwoływać w naszych innych skryptach U-SQL. Omówimy kluczowe pojęcia, które sprawiają, że ten skrypt przejdzie w następnej sekcji.

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

Odczytywanie danych z pliku

Teraz, gdy mamy pewne dane, przeczytajmy je z utworzonego pliku.

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

Ten skrypt nie ma żadnych kroków przekształcania. Odczytuje z pliku źródłowego o nazwie SearchLog.tsv, schematyzuje go i zapisuje zestaw wierszy z powrotem do pliku o nazwie SearchLog-first-u-sql.csv.

Zwróć uwagę na znak zapytania obok typu danych w Duration polu. Oznacza to, że Duration pole może mieć wartość null.

Kluczowe pojęcia

  • Zmienne zestawu wierszy: każde wyrażenie zapytania, które tworzy zestaw wierszy, można przypisać do zmiennej. Język U-SQL jest zgodny ze wzorcem nazewnictwa zmiennych T-SQL (@searchlogna przykład) w skrycie.
  • Słowo kluczowe EXTRACT odczytuje dane z pliku i definiuje schemat podczas odczytu. Extractors.Tsv to wbudowany moduł wyodrębniania U-SQL dla plików wartości rozdzielanych tabulatorami. Możesz tworzyć niestandardowe ekstraktory.
  • Dane wyjściowe zapisują dane z zestawu wierszy do pliku. Outputters.Csv() jest wbudowanym modułem wyjściowym U-SQL umożliwiającym utworzenie pliku wartości rozdzielanej przecinkami. Możesz tworzyć niestandardowe dane wyjściowe.

Ścieżki plików

Instrukcje EXTRACT i OUTPUT używają ścieżek plików. Ścieżki plików mogą być bezwzględne lub względne:

Następująca bezwzględna ścieżka pliku odnosi się do pliku w usłudze Data Lake Store o nazwie mystore:

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

Następująca ścieżka pliku rozpoczyna się od "/". Odwołuje się on do pliku na domyślnym koncie usługi Data Lake Store:

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

Używanie zmiennych skalarnych

Możesz również użyć zmiennych skalarnych, aby ułatwić konserwację skryptów. Poprzedni skrypt U-SQL można również napisać jako:

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

Przekształcanie zestawów wierszy

Użyj opcji SELECT , aby przekształcić zestawy wierszy. Ten skrypt wybierze kolumny Start, Region i Duration i zapisze te wiersze w pliku, gdy region ma wartość "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();

Klauzula WHERE używa wyrażenia logicznego języka C#. Możesz użyć języka wyrażeń języka C#, aby wykonywać własne wyrażenia i funkcje. Można nawet wykonać bardziej złożone filtrowanie, łącząc je z logicznymi połączeniami (AND) i odwiedzeniami (ORS).

Poniższy skrypt używa metody DateTime.Parse() i połączenia. kolumny Start, Region i Duration, gdzie Region ma wartość "en-gb". Następnie sprawdza wartości kolumny Czas trwania między określonymi datami i zapisuje te wartości w pliku:

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

Uwaga

Drugie zapytanie działa na podstawie wyniku pierwszego zestawu wierszy, który tworzy złożony z dwóch filtrów. Możesz również ponownie użyć nazwy zmiennej, a nazwy są objęte zakresem leksykalnie.

Agregowanie zestawów wierszy

Język U-SQL udostępnia znane polecenia ORDER BY, GROUP BY i agregacje.

Poniższe zapytanie znajduje łączny czas trwania na region, a następnie wyświetla pięć pierwszych trwania w kolejności.

Zestawy wierszy U-SQL nie zachowują kolejności dla następnego zapytania. W związku z tym, aby zamówić dane wyjściowe, należy dodać element ORDER BY do instrukcji 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();

Klauzula U-SQL ORDER BY wymaga użycia klauzuli FETCH w wyrażeniu SELECT.

Klauzula U-SQL HAVING może służyć do ograniczenia danych wyjściowych do grup spełniających warunek 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();

Aby zapoznać się z zaawansowanymi scenariuszami agregacji, zobacz dokumentację referencyjną języka U-SQL dotyczącą funkcji agregujących, analitycznych i referencyjnych.

Następne kroki