我有一个元数据活动输出,这是我的容器中的斑点。我想将这些名称输入我的foreach活动,其中按文件名在斑点上执行一些U-SQL查询。有可能吗?
您需要包括SELECT
或EXTRACT
。由于您要从文件中拉出,因此您将要使用EXTRACT
。
如果我正确理解您的问题,您想根据文件名运行不同的u-SQL脚本。
有几种方法可以做到这一点:
1(如果在数据工厂中使用条件,请根据文件名调用不同的U-SQL脚本。嵌套if语句将使您拥有两个以上的选项。有几个字符串操作功能可以帮助您解决此问题。说一条路是@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脚本,然后从那里进行拆分。同样,字符串操纵功能可以通过模式匹配来帮助。就组织而言,这有一些优势,您可以将唯一的脚本存储在存储过程中,并且U-SQL脚本只需检查传递的文件名并调用相关存储的Proc。
//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;
要考虑的事情是,如果您可以将多个文件组合到一个语句中,那么数据湖分析将更加有效。您可以具有多个EXTRACT
和OUTPUT
语句。我鼓励您探索您是否可以在EXTRACT
语句中使用模式匹配来拆分U-SQL处理,而无需数据工厂中的foreach循环。