可以使用数组检查是否存在多个文件,但这有点繁琐。我经常将其传递给管道中的另一个活动,例如存储过程或笔记本活动,具体取决于您在管道中可用的计算(例如 SQL 数据库或 Spark 集群)。但是,如果您确实需要在管道中执行此操作,这可能对您有用。
首先,我有一个具有以下值的数组参数:
| Parameter Name |
Parameter Type |
Parameter Value |
| pFilesToCheck |
Array |
["json1.json","json2.json","json3.json","json4.json"] |
这些是必须存在的文件。接下来我有一个 Get Metadata 活动指向一个数据湖文件夹,并在字段列表中设置了 Child Items 参数:
这将以这种格式返回一些输出,列出给定目录中的所有文件,以及一些关于执行的附加信息:
{
"childItems": [
{
"name": "json1.json",
"type": "File"
},
{
"name": "json2.json",
"type": "File"
},
{
"name": "json3.json",
"type": "File"
},
{
"name": "json4.json",
"type": "File"
}
],
"effectiveIntegrationRuntime": "AutoResolveIntegrationRuntime (Some Region)",
"executionDuration": 0,
"durationInQueue": {
"integrationRuntimeQueue": 1
},
"billingReference": {
"activityType": "PipelineActivity",
"billableDuration": [
{
"meterType": "AzureIR",
"duration": 0.016666666666666666,
"unit": "Hours"
}
]
}
}
为了比较输入数组pFilesToCheck(必须存在的文件)与Get Metadata活动的结果(确实存在的文件) ,我们必须将它们放在可比较的格式中。我使用 Array 变量来执行此操作:
| Variable Name |
Variable Type |
| arrFilenames |
Array |
接下来是一个For Each活动,以顺序模式运行,并使用range函数从0循环到3,即childItems数组中每个项目的数组索引。该表达式确定Get Metadata 输出中的项目数
这是从0开始的。 Items 属性设置为以下表达式:
@range(0,length(activity('Get Metadata File List').output.childItems))
在For Each 活动内部是一个Append 活动,它将for each 循环中的当前项附加到数组变量arrFilenames。它在 Value 属性中使用此表达式:
@activity('Get Metadata File List').output.childItems[item()].name
'@item()' 在这种情况下将是一个介于 0 和 3 之间的数字,由上面提到的 range 函数生成。循环完成后,数组arrFilenames 现在将如下所示(即与输入数组格式相同):
["json1.json","json2.json","json3.json","json4.json"]
现在可以使用intersection 函数比较输入数组和实际文件列表。我使用带有布尔变量的Set Variable 活动来记录结果:
@equals(
length(variables('arrFilenames')),
length(intersection(variables('arrFilenames'),pipeline().parameters.pFilesMustExist)))
这个表达式比较包含实际存在的文件的数组的长度与通过交集函数连接到应该存在的文件的输入数组的同一数组的长度。如果数字匹配,则所有文件都存在。如果数字不匹配,则不所有文件都存在。