有没有一种方法可以不使用EXTRACT编写u-sql查询

时间:2019-05-16 06:02:46

标签: json azure azure-data-factory u-sql

我有一个元数据活动输出,该输出是容器中Blob的json。我想将这些名称输入到我的foreach活动中,其中根据文件名对Blob执行一些u-sql查询。有可能吗?

1 个答案:

答案 0 :(得分:1)

您需要包含SELECTEXTRACT。由于要从文件中提取文件,因此您将要使用EXTRACT

如果我正确理解了您的问题,则希望基于文件名运行不同的U-SQL脚本。

有几种方法可以做到这一点:

1)使用Data Factory中的If条件根据文件名调用不同的U-SQL脚本。嵌套if语句将使您拥有两个以上的选择。有several string manipulation个函数可以帮助您。假设一条路径是@item.Contains('a')

{
    "name": "<Name of the activity>",
    "type": "IfCondition",
    "typeProperties": {
            "expression":  {
                 "value":  "@item() == <file name>", 
                 "type": "Expression"
             }
            "ifTrueActivities": [
            {
                "<U-SQL script = 1>"
            }
        ],

        "ifFalseActivities": [
            {
                "<U-SQL script 2>"
            }
            ]
    }
}

2)第二个选项是使用单个U-SQL脚本并从那里进行拆分。同样,string manipulation functions可以通过模式匹配提供帮助。就组织而言,您可以将唯一的脚本存储在存储过程中,这有一些好处,而U-SQL脚本只需检查传入的文件名并调用相关的存储过程。

//This would be added by data factory
DECLARE @fileName = "/Samples/Data/SearchLog.tsv";

IF @fileName == "/Samples/Data/SearchLog.tsv"
THEN
    @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 @fileName
    USING Outputters.Csv();

ELSE
    @searchlog =
        EXTRACT UserId int,
                Start DateTime,
                Region string,
                Query string,
                Duration int?,
                Urls string,
                ClickedUrls string
        FROM @fileName
        USING Extractors.Tsv();

    OUTPUT @searchlog
    TO "/output/SearchLogResult1.csv"
    USING Outputters.Csv();
END;

需要考虑的一点是,如果您可以将多个文件合并为一个语句,那么Data Lake Analytics将更加高效。您可以有多个EXTRACTOUTPUT语句。我鼓励您探讨一下是否可以在EXTRACT语句中使用模式匹配来拆分U-SQL处理而无需数据工厂中的foreach循环。