如何在ADF中获取结构不规则父文件夹下所有Parquet文件的元数据
在Azure Data Factory中获取不规则子文件夹下所有Parquet文件的元数据
如果你需要获取父文件夹下所有层级的Parquet文件元数据,有两种可行方案,可根据场景选择:
方案一:利用Get Metadata的递归特性(最简单)
ADF的Get Metadata活动默认仅遍历一级目录,但支持开启递归获取所有子层级内容:
- 创建一个Get Metadata活动,数据源指向父文件夹
Tommy - 在活动的字段列表中勾选
childItems,用来获取所有子项 - 进入数据源配置界面,找到并勾选
Recursive选项(不同存储类型的位置略有差异:比如ADLS Gen2在数据集的连接设置中,Blob存储在活动的数据源参数里) - 运行活动后,
childItems会返回Tommy下所有层级的文件和文件夹 - 添加Filter活动,输入设置为
@activity('Get Metadata活动名').output.childItems,过滤条件写@endsWith(item().name, '.snappy.parquet'),仅保留Parquet文件 - 再添加Select活动,输入为Filter活动的输出,在映射中指定:
name:@item().name(若返回的不是完整路径,需拼接父文件夹路径,示例:@concat('Tommy/', item().name))lastModified:@item().lastModified
- 最终Select活动的输出就是你需要的JSON数组格式
方案二:递归遍历(适用于不支持递归的场景)
如果存储类型不支持Get Metadata的递归特性,或需要更灵活的逻辑,可以用Foreach+Get Metadata实现递归遍历:
- 先创建一个数组类型的变量
allParquetFiles,用来存储最终结果 - 创建初始Get Metadata活动,获取
Tommy下的一级子项(勾选childItems) - 添加Foreach活动,项设置为
@activity('初始Get Metadata').output.childItems,开启顺序执行 - 在Foreach内部添加If Condition活动,判断当前项是否为文件夹:
@equals(item().type, 'Folder')- True分支(文件夹):添加另一个Get Metadata活动,数据源指向该子文件夹并获取其
childItems,将这个输出作为新的遍历项,嵌套Foreach活动(或调用包含相同逻辑的管道实现递归) - False分支(文件):添加另一个If Condition,判断是否为Parquet文件:
@endsWith(item().name, '.snappy.parquet'),如果是,使用Set Variable活动将文件元数据追加到allParquetFiles变量中,表达式示例:@concat(variables('allParquetFiles'), createArray(json(concat('{"name": "', concat('Tommy/', item().name), '", "lastModified": "', item().lastModified, '"}'))))
- True分支(文件夹):添加另一个Get Metadata活动,数据源指向该子文件夹并获取其
- 遍历完成后,
allParquetFiles变量中就存储了所有符合条件的文件元数据
注意事项
- 确保存储账户的权限足够,ADF能访问所有子文件夹
- 如果文件数量较多,可根据实际情况调整Foreach的并发数(顺序执行速度较慢,高并发需注意存储服务的限流)
- 完整路径的拼接要准确,避免出现路径错误
内容的提问来源于stack exchange,提问作者tommyhmt
相关产品推荐
相关产品推荐

