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
- U-SQL-självstudien innehåller en guidad genomgång av det mesta av U-SQL-språket. Det här dokumentet rekommenderas att läsa för alla utvecklare som vill lära sig U-SQL.
- Detaljerad information om U-SQL-språksyntaxen finns i referensen för U-SQL-språk.
- Information om designfilosofin för U-SQL finns i Visual Studio-blogginlägget Introducing U-SQL – A Language that makes Big Data Processing Easy (Introduktion till U-SQL – Ett språk som gör stordatabearbetning enkelt).
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 (
@searchlog
till 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.