Kom igång med U-SQL i Azure Data Lake Analytics

Viktigt

Azure Data Lake Analytics drog sig tillbaka den 29 februari 2024. Läs mer med det här meddelandet.

För dataanalys kan din organisation använda Azure Synapse Analytics eller Microsoft Fabric.

U-SQL är ett språk som kombinerar deklarativ SQL med imperativ C# så att du kan bearbeta data i valfri skala. Med U-SQL:s skalbara, distribuerade frågefunktion kan du effektivt analysera data i relationslager, till exempel Azure SQL Database. Med U-SQL kan du bearbeta ostrukturerade data genom att använda schemat för att läsa och infoga anpassad logik och UDF:er. Dessutom innehåller U-SQL utökningsbarhet som ger dig detaljerad kontroll över hur du kör i stor skala.

Utbildningsresurser

Nu ska vi skapa lite data

Följande U-SQL-skript är enkelt och låter oss skapa en exempeldatafil som vi kan referera till i våra andra U-SQL-skript. Vi går igenom de viktigaste begreppen som gör att skriptet går vidare i nästa avsnitt.

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

Läsa data från en fil

Nu när vi har några data ska vi läsa dem från filen som vi skapade.

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

Det här skriptet har inga transformeringssteg. Den läser från källfilen med namnet SearchLog.tsv, schematiserar den och skriver raduppsättningen tillbaka till en fil som heter SearchLog-first-u-sql.csv.

Lägg märke till frågetecknet bredvid datatypen i fältet Duration . Det innebär att fältet Duration kan vara null.

Viktiga begrepp

  • Raduppsättningsvariabler: Varje frågeuttryck som skapar en raduppsättning kan tilldelas till en variabel. U-SQL följer namnmönstret för T-SQL-variabeln (@searchlogtill exempel) i skriptet.
  • Nyckelordet EXTRACT läser data från en fil och definierar schemat vid läsning. Extractors.Tsv är en inbyggd U-SQL-extraktor för tab-separated-value-filer. Du kan utveckla anpassade extraktorer.
  • UTDATA skriver data från en raduppsättning till en fil. Outputters.Csv() är en inbyggd U-SQL-utdata för att skapa en kommaavgränsad värdefil. Du kan utveckla anpassade utdata.

Filsökvägar

UTTRYCKEN EXTRACT och OUTPUT använder filsökvägar. Filsökvägar kan vara absoluta eller relativa:

Följande absoluta filsökväg refererar till en fil i ett Data Lake Store med namnet mystore:

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

Följande filsökväg börjar med "/". Den refererar till en fil i standardkontot för Data Lake Store:

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

Använda skalärvariabler

Du kan även använda skalära variabler för att göra skriptunderhållet enklare. Det tidigare U-SQL-skriptet kan också skrivas som:

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

Transformera raduppsättningar

Använd SELECT för att transformera raduppsättningar. Det här skriptet väljer kolumnerna Start, Region och Varaktighet och skriver dessa rader till en fil när Region har värdet "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();

WHERE-satsen använder ett C#-booleskt uttryck. Du kan använda C#-uttrycksspråket för att göra dina egna uttryck och funktioner. Du kan även utföra mer komplex filtrering genom att kombinera dem med logiska konjunktioner (AND) och disjunctions (ORs).

Följande skript använder metoden DateTime.Parse() och en konjunktion. kolumnerna Start, Region och Varaktighet, där Regionen har värdet "en-gb". Sedan söker den efter värden i kolumnen Varaktighet mellan vissa datum och skriver dessa värden till en fil:

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

Anteckning

Den andra frågan körs på resultatet av den första raduppsättningen, vilket skapar en sammansatt av de två filtren. Du kan också återanvända ett variabelnamn och namnen begränsas lexikalt.

Aggregera raduppsättningar

U-SQL ger dig välbekanta ORDER BY, GROUP BY och aggregeringar.

Följande fråga söker efter den totala varaktigheten per region och visar sedan de fem översta varaktigheterna i ordning.

U-SQL-raduppsättningar bevarar inte sin ordning för nästa fråga. För att beställa utdata måste du därför lägga till ORDER BY i output-instruktionen:

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

U-SQL ORDER BY-satsen kräver att FETCH-satsen används i ett SELECT-uttryck.

U-SQL HAVING-satsen kan användas för att begränsa utdata till grupper som uppfyller HAVING-villkoret:

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

Avancerade aggregeringsscenarier finns i U-SQL-referensdokumentationen för aggregerings-, analys- och referensfunktioner.

Nästa steg