Azure Data Lake Analytics の U-SQL を使用するGet started with U-SQL in Azure Data Lake Analytics

U-SQL は、あらゆる規模のデータの処理を可能にするために、宣言型の SQL と命令型の C# を組み合わせた言語です。U-SQL is a language that combines declarative SQL with imperative C# to let you process data at any scale. U-SQL のスケーラブルな分散クエリ機能を使用することで、Azure SQL Database などのリレーショナル ストアのデータを効率的に分析できます。Through the scalable, distributed-query capability of U-SQL, you can efficiently analyze data across relational stores such as Azure SQL Database. U-SQL では、読み取り時にスキーマを適用し、カスタム ロジックと UDF を挿入することで、非構造化データを処理できます。With U-SQL, you can process unstructured data by applying schema on read and inserting custom logic and UDFs. また、U-SQL には、スケールを実行する方法をきめ細かく制御する拡張性があります。Additionally, U-SQL includes extensibility that gives you fine-grained control over how to execute at scale.

学習用のリソースLearning resources

前提条件Prerequisites

このドキュメントの U-SQL サンプルを実行する前に、次の資料を読んで完了します: 「チュートリアル:Data Lake Tools for Visual Studio を使用して U-SQL スクリプトを開発する」。Before you go through the U-SQL samples in this document, read and complete Tutorial: Develop U-SQL scripts using Data Lake Tools for Visual Studio. このチュートリアルでは、Azure Data Lake Tools for Visual Studio での U-SQL の使用のメカニズムについて説明しています。That tutorial explains the mechanics of using U-SQL with Azure Data Lake Tools for Visual Studio.

最初の U-SQL スクリプトYour first U-SQL script

以下の U-SQL スクリプトは単純で、U-SQL 言語のさまざまな側面を確認することができます。The following U-SQL script is simple and lets us explore many aspects the U-SQL language.

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

このスクリプトに変換手順は含まれていません。This script doesn't have any transformation steps. SearchLog.tsv というソース ファイルから読み取り、体系化して、SearchLog-first-u-sql.csv というファイルに行セットを書き込み直します。It reads from the source file called SearchLog.tsv, schematizes it, and writes the rowset back into a file called SearchLog-first-u-sql.csv.

Duration フィールドのデータ型の横にある疑問符に注目してください。Notice the question mark next to the data type in the Duration field. これは、Duration フィールドを null にできることを意味します。It means that the Duration field could be null.

主要な概念Key concepts

  • 行セットの変数: 行セットを生成する各クエリ式を変数に割り当てることができます。Rowset variables: Each query expression that produces a rowset can be assigned to a variable. U-SQL は、スクリプトでは T-SQL 変数命名パターンに従います (例: @searchlog)。U-SQL follows the T-SQL variable naming pattern (@searchlog, for example) in the script.
  • EXTRACT のキーワードは、データをファイルから読み取り、読み取り時にスキーマを定義します。The EXTRACT keyword reads data from a file and defines the schema on read. Extractors.Tsv はタブ区切り値ファイルのための、組み込みの U-SQL エクストラクターです。Extractors.Tsv is a built-in U-SQL extractor for tab-separated-value files. カスタムのエクストラクターを開発することができます。You can develop custom extractors.
  • OUTPUT は、行セットからファイルにデータを書き込みます。The OUTPUT writes data from a rowset to a file. Outputters.Csv() は、コンマ区切り値ファイルを作成するための、組み込みの U-SQL アウトプッターです。Outputters.Csv() is a built-in U-SQL outputter to create a comma-separated-value file. カスタムのアウトプッターを作成することができます。You can develop custom outputters.

ファイル パスFile paths

EXTRACT と OUTPUT のステートメントでは、ファイル パスを使用します。The EXTRACT and OUTPUT statements use file paths. ファイルは、絶対パスまたは相対パスで指定できます。File paths can be absolute or relative:

次の絶対ファイル パスは、mystore という名前の Data Lake Store のファイルを指しています。This following absolute file path refers to a file in a Data Lake Store named mystore:

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

次のファイル パスは、"/" で始まっています。This following file path starts with "/". 既定の Data Lake Store アカウントのファイルを指しています。It refers to a file in the default Data Lake Store account:

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

スカラー変数の使用Use scalar variables

スカラー変数も使用して、スクリプトのメンテナンスを容易にすることができます。You can use scalar variables as well to make your script maintenance easier. 次のように、前の U-SQL スクリプトを記述することもできます。The previous U-SQL script can also be written as:

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

行セットの変換Transform rowsets

以下のように、 SELECT を使用して行セットを変換します。Use SELECT to transform rowsets:

@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# ブール式を使用します。The WHERE clause uses a C# Boolean expression. C# 式言語を使用して、独自の式と関数を実行することができます。You can use the C# expression language to do your own expressions and functions. 論理積 (AND) および論理和 (OR) と組み合わせることによって、より複雑なフィルター処理を実行することもできます。You can even perform more complex filtering by combining them with logical conjunctions (ANDs) and disjunctions (ORs).

次のスクリプトでは、DateTime.Parse() メソッドと論理積を使用します。The following script uses the DateTime.Parse() method and a conjunction.

@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 つのフィルターを組み合わたものです。The second query is operating on the result of the first rowset, which creates a composite of the two filters. また、変数名を再利用することもできます。その場合、名前は字句単位でスコープされます。You can also reuse a variable name, and the names are scoped lexically.

行セットの集計Aggregate rowsets

U-SQL では、使い慣れた ORDER BY、GROUP BY および集計が提供されます。U-SQL gives you the familiar ORDER BY, GROUP BY, and aggregations.

次のクエリでは、リージョンごとの合計期間を検索してから、上位 5 つの期間を順に表示します。The following query finds the total duration per region, and then displays the top five durations in order.

次のクエリの場合、U-SQL 行セットの順序は保持されません。U-SQL rowsets do not preserve their order for the next query. そのため、出力を順序付けるには、次のように OUTPUT ステートメントに ORDER BY を追加する必要があります。Thus, to order an output, you need to add ORDER BY to the OUTPUT statement:

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 句と組み合わせる必要があります。The U-SQL ORDER BY clause requires using the FETCH clause in a SELECT expression.

以下のように、U-SQL の HAVING 句を使用して、HAVING 条件を満たすグループに出力を制限することができます。The U-SQL HAVING clause can be used to restrict the output to groups that satisfy the HAVING condition:

@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 リファレンス ドキュメントで集計、分析、参照の各関数をご確認くださいFor advanced aggregation scenarios, see the U-SQL reference documentation for aggregate, analytic, and reference functions

次の手順Next steps