Aan de slag met U-SQL in Azure Data Lake Analytics
Belangrijk
Azure Data Lake Analytics op 29 februari 2024 buiten gebruik gesteld. Meer informatie over deze aankondiging.
Voor gegevensanalyse kan uw organisatie gebruikmaken van Azure Synapse Analytics of Microsoft Fabric.
U-SQL is een taal die declaratieve SQL combineert met imperatieve C# zodat u gegevens op elke schaal kunt verwerken. Dankzij de schaalbare, gedistribueerde queryfunctie van U-SQL kunt u gegevens in relationele archieven, zoals Azure SQL Database, efficiënt analyseren. Met U-SQL kunt u ongestructureerde gegevens verwerken door een schema toe te passen op het lezen en invoegen van aangepaste logica en UDF's. Bovendien bevat U-SQL uitbreidbaarheid waarmee u gedetailleerde controle hebt over hoe u op schaal kunt uitvoeren.
Trainingsmateriaal
- De U-SQL-zelfstudie biedt een stapsgewijs overzicht van het grootste deel van de U-SQL-taal. Dit document wordt aanbevolen voor alle ontwikkelaars die U-SQL willen leren.
- Zie U-SQL Language Reference (Naslaginformatie over de U-SQL-taal) voor gedetailleerde informatie over de U-SQL-taalsyntaxis.
- Als u de U-SQL-ontwerpfilosofie wilt begrijpen, raadpleegt u het Visual Studio-blogbericht Introducing U-SQL – A Language that makes Big Data Processing Easy .
Laten we wat gegevens maken
Het volgende U-SQL-script is eenvoudig en laat ons een voorbeeldgegevensbestand maken waarnaar we kunnen verwijzen in onze andere U-SQL-scripts. In de volgende sectie bespreken we de belangrijkste concepten die ervoor zorgen dat dit script wordt uitgevoerd.
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();
Gegevens uit een bestand lezen
Nu we enkele gegevens hebben, gaan we deze lezen uit het bestand dat we hebben gemaakt.
@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();
Dit script heeft geen transformatiestappen. Het leest uit het bronbestand met de naam SearchLog.tsv
, schematiseert het en schrijft de rijenset terug naar een bestand met de naam SearchLog-first-u-sql.csv.
Let op het vraagteken naast het gegevenstype in het Duration
veld. Dit betekent dat het Duration
veld null kan zijn.
Belangrijkste concepten
-
Rijensetvariabelen: elke query-expressie die een rijenset produceert, kan worden toegewezen aan een variabele. U-SQL volgt (bijvoorbeeld) het naamgevingspatroon
@searchlog
van T-SQL-variabelen in het script. - Het trefwoord EXTRACT leest gegevens uit een bestand en definieert het schema bij het lezen.
Extractors.Tsv
is een ingebouwde U-SQL-extractor voor bestanden met door tabs gescheiden waarden. U kunt aangepaste extractoren ontwikkelen. - De UITVOER schrijft gegevens uit een rijenset naar een bestand.
Outputters.Csv()
is een ingebouwde U-SQL-uitvoerter om een bestand met door komma's gescheiden waarden te maken. U kunt aangepaste uitvoerters ontwikkelen.
Bestandspaden
De instructies EXTRACT en OUTPUT maken gebruik van bestandspaden. Bestandspaden kunnen absoluut of relatief zijn:
Dit volgende absolute bestandspad verwijst naar een bestand in een Data Lake Store met de naam mystore
:
adl://mystore.azuredatalakestore.net/Samples/Data/SearchLog.tsv
Dit volgende bestandspad begint met "/"
. Het verwijst naar een bestand in het standaard Data Lake Store-account:
/output/SearchLog-first-u-sql.csv
Scalaire variabelen gebruiken
U kunt ook scalaire variabelen gebruiken om het onderhoud van uw script eenvoudiger te maken. Het vorige U-SQL-script kan ook worden geschreven als:
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();
Rijensets transformeren
Gebruik SELECT om rijensets te transformeren. Met dit script worden de kolommen Start, Region en Duration geselecteerd en worden deze rijen naar een bestand geschreven wanneer Regio de waarde 'en-gb' heeft:
@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();
De WHERE-component maakt gebruik van een Booleaanse C#-expressie. U kunt de C#-expressietaal gebruiken om uw eigen expressies en functies uit te voeren. U kunt zelfs complexere filters uitvoeren door deze te combineren met logische combinaties (AND's) en disjunctions (OK's).
In het volgende script wordt de methode DateTime.Parse() en een combinatie gebruikt. kolommen Start, Region en Duration, waarbij Region de waarde 'en-gb' heeft. Vervolgens wordt gecontroleerd op waarden van de kolom Duur tussen bepaalde datums en worden deze waarden naar een bestand geschreven:
@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();
Notitie
De tweede query wordt uitgevoerd op het resultaat van de eerste rijenset, waarmee een samenstelling van de twee filters wordt gemaakt. U kunt ook de naam van een variabele opnieuw gebruiken en de namen hebben een lexicatisch bereik.
Rijensets aggregeren
U-SQL biedt u de vertrouwde ORDER BY, GROUP BY en aggregaties.
Met de volgende query wordt de totale duur per regio gevonden en vervolgens worden de vijf belangrijkste duurs in volgorde weergegeven.
U-SQL-rijensets behouden hun volgorde voor de volgende query niet. Als u dus een uitvoer wilt bestellen, moet u ORDER BY toevoegen aan de instructie 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();
De U-SQL ORDER BY-component vereist het gebruik van de FETCH-component in een SELECT-expressie.
De U-SQL HAVING-component kan worden gebruikt om de uitvoer te beperken tot groepen die voldoen aan de HAVING-voorwaarde:
@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();
Zie de U-SQL-referentiedocumentatie voor statistische, analytische en referentiefuncties voor geavanceerde aggregatiescenario's.