Introduzione a U-SQL in Azure Data Lake Analytics
Importante
Azure Data Lake Analytics è stato ritirato il 29 febbraio 2024. Per altre informazioni, vedere questo annuncio.
Per l'analisi dei dati, l'organizzazione può usare Azure Synapse Analytics o Microsoft Fabric.
U-SQL è un linguaggio che combina SQL dichiarativo con C# imperativo per consentire l'elaborazione dei dati su qualsiasi scala. Grazie alla funzionalità di query distribuita e scalabile di U-SQL, è possibile analizzare in modo efficiente i dati tra archivi relazionali, ad esempio il database SQL di Azure. Con U-SQL è possibile elaborare dati non strutturati applicando lo schema in lettura e inserendo funzioni definite dall'utente e logica personalizzate. Inoltre, U-SQL include estensibilità che offre un controllo granulare sulla modalità di esecuzione su larga scala.
Risorse di formazione
- L'esercitazione U-SQL fornisce una guida dettagliata della maggior parte del linguaggio U-SQL. Questo documento è consigliato per tutti gli sviluppatori che vogliono apprendere U-SQL.
- Per informazioni dettagliate sulla sintassi del linguaggio U-SQL , vedere il Riferimento al linguaggio U-SQL.
- Per comprendere la filosofia di progettazione U-SQL , vedere il post di blog di Visual Studio Introduzione a U-SQL : un linguaggio che semplifica l'elaborazione di Big Data.
Creare alcuni dati
Lo script U-SQL seguente è semplice e consente di creare un file di dati di esempio a cui è possibile fare riferimento negli altri script U-SQL. Verranno illustrati i concetti chiave che rendono questo script disponibile nella sezione successiva.
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();
Leggere i dati da un file
Ora che abbiamo ottenuto alcuni dati, leggiamoli dal file che abbiamo creato.
@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();
Questo script non include passaggi di trasformazione. Legge dal file di origine denominato SearchLog.tsv
, lo schematizza e scrive nuovamente il set di righe in un file denominato SearchLog-first-u-sql.csv.
Si noti il punto interrogativo accanto al tipo di dati nel campo Duration
. Significa che il campo Duration
potrebbe essere Null.
Concetti chiave
-
variabili del set di righe: ogni espressione di query che produce un set di righe può essere assegnata a una variabile. U-SQL segue il modello di denominazione delle variabili T-SQL (
@searchlog
, ad esempio) nello script. - La parola chiave EXTRACT legge i dati da un file e definisce lo schema in lettura.
Extractors.Tsv
è un estrattore U-SQL integrato per file con valori separati da tabulazioni. È possibile sviluppare estrattori personalizzati. - Il OUTPUT scrive i dati da un set di righe in un file.
Outputters.Csv()
è un outputter U-SQL predefinito per creare un file con valori delimitati da virgole. È possibile sviluppare outputter personalizzati.
Percorsi di file
Le istruzioni EXTRACT e OUTPUT usano percorsi di file. I percorsi dei file possono essere assoluti o relativi:
Questo percorso di file assoluto seguente fa riferimento a un file in un Archivio Data Lake denominato mystore
:
adl://mystore.azuredatalakestore.net/Samples/Data/SearchLog.tsv
Questo percorso di file seguente inizia con "/"
. Fa riferimento a un file nell'account Data Lake Store predefinito:
/output/SearchLog-first-u-sql.csv
Usare le variabili scalari
È possibile usare anche le variabili scalari per semplificare la manutenzione dello script. Lo script U-SQL precedente può anche essere scritto come segue:
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();
Trasformare gli insiemi di righe
Usare SELECT per trasformare i set di righe. Questo script selezionerà le colonne Start, Region e Duration e scriverà tali righe in un file quando Region ha il valore "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 clausola WHERE usa un'espressione booleana C#. È possibile usare il linguaggio delle espressioni C# per eseguire espressioni e funzioni personalizzate. È anche possibile eseguire filtri più complessi combinandoli con congiunzioni logiche (AND) e disgiunzioni (ORS).
Lo script seguente usa il metodo DateTime.Parse() e una congiunzione. colonne Start, Region e Duration, dove Region ha il valore "en-gb". Verifica quindi la presenza di valori della colonna Durata tra determinate date e scrive tali valori in un file:
@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 seconda query opera sul risultato del primo set di righe, che crea una composizione dei due filtri. È anche possibile riutilizzare un nome di variabile e i nomi hanno un ambito lessicale.
Aggregare insiemi di righe
U-SQL offre le familiari funzionalità ORDER BY, GROUP BY e le aggregazioni.
La query seguente trova la durata totale per area e quindi visualizza le prime cinque durate in ordine.
I set di righe U-SQL non mantengono l'ordine per la query successiva. Per ordinare un output, è quindi necessario aggiungere ORDER BY all'istruzione 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 clausola U-SQL ORDER BY richiede l'uso della clausola FETCH in un'espressione SELECT.
La clausola U-SQL HAVING può essere usata per limitare l'output ai gruppi che soddisfano la condizione 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();
Per scenari di aggregazione avanzati, vedere la documentazione di riferimento di U-SQL per funzioni di aggregazione, analisi e riferimento.