Mulai menggunakan U-SQL di Azure Data Lake Analytics

Penting

Azure Data Lake Analytics pensiun pada 29 Februari 2024. Pelajari lebih lanjut dengan pengumuman ini.

Untuk analitik data, organisasi Anda dapat menggunakan Azure Synapse Analytics atau Microsoft Fabric.

U-SQL adalah bahasa yang menggabungkan SQL deklaratif dengan C# imperatif untuk memungkinkan Anda memproses data dalam skala berapa pun. Melalui kemampuan U-SQL yang dapat diskalakan dan didistribusikan kueri, Anda dapat menganalisis data secara efisien di seluruh penyimpanan relasional seperti Azure SQL Database. Dengan U-SQL, Anda dapat memproses data yang tidak terstruktur dengan menerapkan skema pada baca dan menyisipkan logika kustom dan UDF. Selain itu, U-SQL mencakup perluasan yang memberi Anda kontrol terperinci tentang cara mengeksekusi berskala.

Sumber daya pembelajaran

Mari kita buat beberapa data

Skrip U-SQL berikut ini sederhana dan memungkinkan kami membuat file data sampel yang dapat kami referensikan di skrip U-SQL kami yang lain. Kita akan membahas konsep utama yang membuat skrip ini masuk di bagian berikutnya.

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

Membaca data dari file

Sekarang setelah kita memiliki beberapa data, mari kita baca dari file yang kita buat.

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

Skrip ini tidak memiliki langkah transformasi. Ia membaca dari file sumber yang disebut SearchLog.tsv, menskemakannya, dan menulis set baris kembali ke file yang disebut SearchLog-first-u-sql.csv.

Perhatikan tanda tanya di samping jenis data di bidang Duration. Artinya bidang Duration bisa null.

Konsep utama

  • Variabel set baris: Setiap ekspresi kueri yang menghasilkan set baris dapat ditetapkan ke variabel. U-SQL mengikuti pola penamaan variabel T-SQL (@searchlog, contohnya) dalam skrip.
  • Kata kunci EXTRACT membaca data dari file dan menentukan skema saat dibaca. Extractors.Tsv adalah ekstraktor U-SQL bawaan untuk file nilai yang dipisahkan tab. Anda dapat mengembangkan ekstraktor khusus.
  • OUTPUT menulis data dari set baris ke file. Outputters.Csv() adalah outputter U-SQL bawaan untuk membuat file nilai yang dipisahkan koma. Anda dapat mengembangkan outputter khusus.

Jalur file

Pernyataan EXTRACT dan OUTPUT menggunakan jalur file. Jalur file bisa absolut atau relatif:

Jalur file absolut berikut ini merujuk ke file di Data Lake Storage bernama mystore:

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

Jalur file berikut ini dimulai dengan "/". Ia mengacu pada file di akun Data Lake Store default:

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

Menggunakan variabel skalar

Anda dapat menggunakan variabel skalar juga untuk mempermudah pemeliharaan skrip Anda. Skrip U-SQL sebelumnya juga dapat ditulis sebagai:

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

Mengubah set baris

Gunakan SELECT untuk mengubah kumpulan baris. Skrip ini akan memilih kolom Mulai, Wilayah, dan Durasi, dan akan menulis baris tersebut ke file ketika Wilayah memiliki nilai "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();

Klausa WHERE menggunakan ekspresi C# Boolean. Anda dapat menggunakan bahasa ekspresi C# untuk melakukan ekspresi dan fungsi Anda sendiri. Anda bahkan dapat melakukan pemfilteran yang lebih kompleks dengan menggabungkannya dengan konjungsi logis (AND) dan disjungsi (OR).

Skrip berikut menggunakan metode DateTime.Parse() dan konjungsi. kolom Mulai, Wilayah, dan Durasi, di mana Wilayah memiliki nilai "en-gb". Kemudian memeriksa nilai kolom Durasi antara tanggal tertentu dan menulis nilai tersebut ke 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();

Catatan

Kueri kedua beroperasi pada hasil set baris pertama, yang membuat gabungan dari dua filter. Anda juga dapat menggunakan kembali nama variabel, dan nama-nama tersebut tercakup secara leksikal.

Agregat himpunan baris

U-SQL memberi Anda ORDER BY, GROUP BY, dan agregasi yang sudah akrab.

Kueri berikut ini menemukan total durasi per region, lalu menampilkan lima durasi teratas secara berurutan.

Kumpulan baris U-SQL tidak mempertahankan urutannya untuk kueri berikutnya. Dengan demikian, untuk memesan output, Anda perlu menambahkan ORDER BY ke pernyataan 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();

Klausa ORDER BY U-SQL memerlukan penggunaan klausa FETCH dalam ekspresi SELECT.

Klausa HAVING U-SQL dapat digunakan untuk membatasi output ke grup yang memenuhi kondisi 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();

Untuk skenario agregasi tingkat lanjut, lihat dokumentasi referensi U-SQL untuk fungsi agregat, analitik, dan referensi.

Langkah berikutnya