可以使用数组检查是否存在多个文件,但这有点繁琐。我经常将其传递给管道中的另一个活动,例如存储过程或笔记本活动,具体取决于您在管道中可用的计算(例如 SQL 数据库或 Spark 集群)。但是,如果您确实需要在管道中执行此操作,这可能对您有用。
首先,我有一个具有以下值的数组参数:
参数名称 |
参数类型 |
参数值 |
pFilesToCheck |
大批 |
["json1.json","json2.json","json3.json","json4.json"] |
这些是必须存在的文件。接下来,我有一个Get Metadata
指向数据湖文件夹的活动,并在字段列表中设置了子项参数:
这将以这种格式返回一些输出,列出给定目录中的所有文件,以及有关执行的一些附加信息:
{
"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 变量来执行此操作:
接下来是一个以Sequential模式For Each
运行的活动,并使用该函数从0循环到3,即数组中每个项目的数组索引。该表达式确定输出中从 0 开始的项目数。Items属性设置为以下表达式:range
childItems
Get Metadata
@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
range
在这种情况下,'@item()' 将是由上述函数生成的介于 0 和 3 之间的数字。循环完成后,数组arrFilenames
现在看起来像这样(即与输入数组格式相同):
["json1.json","json2.json","json3.json","json4.json"]
现在可以使用该intersection
函数比较输入数组和实际文件列表。我使用Set Variable
带有布尔变量的活动来记录结果:
@equals(
length(variables('arrFilenames')),
length(intersection(variables('arrFilenames'),pipeline().parameters.pFilesMustExist)))
此表达式将包含实际存在的文件的数组的长度与通过交集函数连接的同一数组的长度与应该存在的文件的输入数组的长度进行比较。如果数字匹配,则所有文件都存在。如果数字不匹配,则并非所有文件都存在。