如何使用Azure Data Factory管道获取类文件夹结构Blob存储元数据
ADF获取Blob三级目录结构下全量CSV文件元数据实现方案
原有方案的核心疏漏
- 不需要为每个目录层级创建独立数据集,多数据集之间本身不支持参数跨级引用,所有路径传参应在活动调用层完成
- 变量引用报错基本是两类原因:一是并行For Each循环内读写同个管道变量触发冲突,二是动态表达式拼接路径时不符合语法规则
- Get Metadata返回固定默认文件名,是因为调用数据集时未将文件名参数置空,只要文件名参数传入空值,活动就会枚举当前路径下的所有子项,不会读取数据集配置的默认值
方案1:零代码高效通配符方案(推荐)
不需要嵌套For Each、不需要多层Get Metadata,2个活动就能完成全量CSV元数据拉取,执行效率远高于层级遍历:
- 第一步:创建通用Blob参数化数据集
关联目标存储账户的链接服务,配置3个数据集参数:containerName:字符串类型,默认值填目标容器名dirPath:字符串类型,默认值留空fileName:字符串类型,默认值留空
数据集路径配置依次绑定上述三个参数,不要写死任何路径值。
- 第二步:配置Lookup活动枚举所有CSV
关联上述通用数据集,传入参数:containerName:固定为你的目标容器名dirPath:填*/*(对应「年份目录/月份目录」两级固定结构,如果存在不确定深度的子目录,填**开启递归匹配)fileName:填*.csv
取消勾选Lookup活动的「仅返回第一行」选项,活动不需要关联任何具体文件内容,会直接返回所有匹配路径规则的文件列表。
- 第三步:存储结果供后续逻辑调用
接一个Set Variable活动,创建数组类型管道变量allCsvFiles,值填@activity('枚举CSV文件').output.value,后续管道的复制、判断逻辑直接遍历这个数组即可,每个数组项自带文件名、完整路径、文件大小、最后修改时间等核心元数据。
方案2:三层遍历原生活动方案(适合需要逐层级做判断的场景)
如果需要在遍历年份、月份的过程中插入自定义过滤逻辑(比如排除特定年份/月份的目录),可以用两层For Each嵌套+Get Metadata的结构实现:
- 前置准备:和方案1用同一个通用参数化数据集即可,不需要额外新建数据集
- 第一层:拉取根目录下所有年份目录
添加Get Metadata活动,关联通用数据集,dirPath和fileName参数都传空值,勾选返回字段为「子项」,输出结果中过滤type为Folder的项即为所有年份目录。 - 第二层:遍历年份目录拉取对应月份列表
添加For Each活动,循环项填@filter(activity('取年份目录').output.childItems, equals(item().type, 'Folder')),如果开启并行执行,将并行度设置为1(避免后续变量读写冲突)。
循环内部先加Set Variable活动,给字符串类型变量currentYear赋值@item().name,存储当前迭代的年份目录名;再加Get Metadata活动,传入dirPath为@variables('currentYear')、fileName为空,返回当前年份下的所有子项,过滤出type为Folder的项即为当年的月份目录列表。 - 第三层:遍历月份目录拉取所有CSV
在第二层For Each内部,取月份列表的Get Metadata后再加一个内层For Each活动,循环项填@filter(activity('取月份目录').output.childItems, equals(item().type, 'Folder'))。
内层循环里添加Get Metadata活动,传入dirPath为@concat(variables('currentYear'), '/', item().name)、fileName为空,返回当月目录下的所有子项;后面接Filter活动,过滤条件为@and(equals(item().type, 'File'), endswith(item().name, '.csv')),得到当月所有CSV文件的元数据。
内层循环最后加Append Variable活动,将过滤得到的CSV项逐个追加到数组变量allCsvFiles中,整个循环执行完成后即可得到全量CSV文件列表供后续逻辑调用。
常见踩坑提示
- Get Metadata活动只会返回传入
dirPath下的直接子项,不会自动递归子目录,不要指望单级Get Metadata拿到多层目录下的文件 - 并行度大于1的For Each循环内,不要对同一个字符串/布尔类型变量做写入操作,会触发并发读写报错,数组类型变量的Append操作不受并行度影响
- 路径拼接时注意目录之间的
/分隔符,不要出现路径连写导致找不到目录的问题
内容的提问来源于stack exchange,提问作者Gregor G.
相关产品推荐
相关产品推荐

