Azure Data Factory中如何匹配SQL表与Blob文件并过滤执行ForEach
解决步骤
1. 提取Blob文件名数组
先通过Get Metadata活动获取目标Blob容器/文件夹下的所有文件(勾选Child items选项),接着用Set Variable活动把文件列表转换成仅包含文件名的数组:
- 新建一个类型为
Array的变量(比如命名为BlobFileNames) - Set Variable的赋值表达式:
这个表达式会遍历Get Metadata返回的文件列表,提取每个文件的@array(map(activity('Get Metadata').output.childItems, item().name))name字段,最终得到类似["File1_20240520.csv", "File2_20240521.parquet"]的纯文件名数组。
2. 过滤存在对应Blob的SQL记录
用Filter Activity对Lookup活动获取的SQL表记录进行过滤:
- 设置Filter的Items为Lookup的输出结果:
@activity('Lookup SQL Table').output.value - 设置过滤Condition为:
这个表达式的逻辑是:遍历Blob文件名数组,只要存在任意一个文件名以当前SQL记录的@any(variables('BlobFileNames'), startswith(item(), item().FileNamePrefix))FileNamePrefix开头,就保留这条记录。比如SQL里的File1前缀,只要Blob里有File1_xxxx开头的文件,这条记录就会被留下。
3. 用ForEach处理过滤后的记录
把ForEach Activity的Items设置为Filter活动的输出结果:
@activity('Filter SQL Records').output.value
在ForEach内部,就可以通过item().TableName和item().FileNamePrefix来调用对应的表名和文件前缀,执行后续的处理逻辑。
注意事项
- 确保Get Metadata活动的路径指向正确的Blob容器或目标文件夹,且已勾选
Child items选项 - 如果Blob文件存储在子文件夹中,需要把文件夹路径包含到
FileNamePrefix中,或者在表达式里调整文件名的匹配逻辑(比如用contains代替startswith,如果前缀是文件夹+文件名的一部分) - 表达式中的活动名称、变量名称要和你实际创建的名称完全一致,避免报错
内容的提问来源于stack exchange,提问作者M Rothwell
相关产品推荐
相关产品推荐

