Azure Data Lake Analytics の U-SQL を使用する

重要

Azure Data Lake Analyticsは、2024 年 2 月 29 日に廃止されました。 詳細については、このお知らせを参照してください。

データ分析の場合、organizationは Azure Synapse Analytics または Microsoft Fabric を使用できます。

U-SQL は、あらゆる規模のデータの処理を可能にするために、宣言型の SQL と命令型の C# を組み合わせた言語です。 U-SQL のスケーラブルな分散クエリ機能を使用することで、Azure SQL Database などのリレーショナル ストアのデータを効率的に分析できます。 U-SQL では、読み取り時にスキーマを適用し、カスタム ロジックと UDF を挿入することで、非構造化データを処理できます。 また、U-SQL には、スケールを実行する方法をきめ細かく制御する拡張性があります。

学習用のリソース

  • U-SQL チュートリアル」では、ほとんどの U-SQL 言語のガイド付きチュートリアルを提供しています。 U-SQL について学習するすべての開発者には、このドキュメントをご覧になることをお勧めします。
  • U-SQL 言語構文の詳細については、「U-SQL Language Reference」(U-SQL 言語のリファレンス) を参照してください。
  • U-SQL のデザインの考え方について理解するには、Visual Studio ブログの投稿「Introducing U-SQL – A Language that makes Big Data Processing Easy」(U-SQL 紹介 – ビッグ データ処理を容易にする言語)を参照してください。

データを作成しましょう

次の U-SQL スクリプトはシンプルです。他の U-SQL スクリプトで参照できるサンプル データ ファイルを作成できます。 このスクリプトを実行するための重要な概念については、次のセクションで説明します。

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

データをファイルから読み取る

データを用意できたので、作成したファイルからデータを読み取りましょう。

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

このスクリプトに変換手順は含まれていません。 SearchLog.tsv というソース ファイルから読み取り、体系化して、SearchLog-first-u-sql.csv というファイルに行セットを書き込み直します。

Duration フィールドのデータ型の横にある疑問符に注目してください。 これは、Duration フィールドを null にできることを意味します。

主要な概念

  • 行セットの変数: 行セットを生成する各クエリ式を変数に割り当てることができます。 U-SQL は、スクリプトでは T-SQL 変数命名パターンに従います (例: @searchlog)。
  • EXTRACT のキーワードは、データをファイルから読み取り、読み取り時にスキーマを定義します。 Extractors.Tsv はタブ区切り値ファイルのための、組み込みの U-SQL エクストラクターです。 カスタムのエクストラクターを開発することができます。
  • OUTPUT は、行セットからファイルにデータを書き込みます。 Outputters.Csv() は、コンマ区切り値ファイルを作成するための、組み込みの U-SQL アウトプッターです。 カスタムのアウトプッターを作成することができます。

ファイル パス

EXTRACT と OUTPUT のステートメントでは、ファイル パスを使用します。 ファイルは、絶対パスまたは相対パスで指定できます。

次の絶対ファイル パスは、mystore という名前の Data Lake Store のファイルを指しています。

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

次のファイル パスは、"/" で始まっています。 既定の Data Lake Store アカウントのファイルを指しています。

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

スカラー変数の使用

スカラー変数も使用して、スクリプトのメンテナンスを容易にすることができます。 次のように、前の U-SQL スクリプトを記述することもできます。

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

行セットの変換

SELECT を使って行セットを変換します。 このスクリプトを使って、Start、Region、Duration の列を選び、Region の値が "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 句では C# ブール式を使用します。 C# 式言語を使用して、独自の式と関数を実行することができます。 論理積 (AND) および論理和 (OR) と組み合わせることによって、より複雑なフィルター処理を実行することもできます。

次のスクリプトでは、DateTime.Parse() メソッドと論理積を使用します。 列が Start、Region、Duration であり、Region の値は "en-gb" です。 次に、Duration 列の値が特定の期間内であるかどうかを確認し、それらの値をファイルに書き込みます。

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

注意

2 番目のクエリは最初の行セットの結果で動作します。結果は 2 つのフィルターを組み合わたものです。 また、変数名を再利用することもできます。その場合、名前は字句単位でスコープされます。

行セットの集計

U-SQL では、使い慣れた ORDER BY、GROUP BY および集計が提供されます。

次のクエリでは、リージョンごとの合計期間を検索してから、上位 5 つの期間を順に表示します。

次のクエリの場合、U-SQL 行セットの順序は保持されません。 そのため、出力を順序付けるには、次のように OUTPUT ステートメントに ORDER BY を追加する必要があります。

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 句では、SELECT 式で FETCH 句と組み合わせる必要があります。

以下のように、U-SQL の HAVING 句を使用して、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();

高度な集計シナリオについては、U-SQL リファレンス ドキュメントで集計、分析、参照の各関数を参照してください。

次のステップ