我有一个元数据活动输出,该输出是容器中Blob的json。我想将这些名称输入到我的foreach活动中,其中根据文件名对Blob执行一些u-sql查询。有可能吗?
答案 0 :(得分:1)
您需要包含SELECT
或EXTRACT
。由于要从文件中提取文件,因此您将要使用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将更加高效。您可以有多个EXTRACT
和OUTPUT
语句。我鼓励您探讨一下是否可以在EXTRACT
语句中使用模式匹配来拆分U-SQL处理而无需数据工厂中的foreach循环。