Azure Data Lake Analytics U-SQL 入门

重要

Azure Data Lake Analytics已于 2024 年 2 月 29 日停用。 通过此公告了解更多信息。

对于数据分析,你的组织可以使用 Azure Synapse AnalyticsMicrosoft Fabric

U-SQL 是一种将声明性 SQL 与命令性 C# 相结合的语言,能够处理任何规模的数据。 通过 U-SQL 的可缩放分布式查询功能,可以跨关系存储(如 Azure SQL 数据库)高效分析其中的数据。 使用 U-SQL,可以通过在读取和插入自定义逻辑和 UDF 时应用架构来处理非结构化数据。 此外,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();

注意

第二个查询基于第一个行集结果执行操作,这会创建两个筛选器的组合。 还可以重复使用变量名,将从词法上审视这些名称。

聚合行集

U-SQL 提供了熟悉的 ORDER BY、GROUP BY 和聚合。

以下查询查找每个区域的总持续时间,并按顺序显示前五个持续时间。

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

在 SELECT 表达式中,U-SQL ORDER BY 子句需要使用 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 参考文档。

后续步骤