如何在ADF中按指定格式存储容器内文件层级元数据至SQL表或CSV?
Azure Data Factory 提取多级文件夹文件层级元数据并存储
核心思路
通过ADF的Get Metadata活动获取文件夹子项,结合递归遍历实现多级文件夹的遍历,提取每个文件的完整路径后拆分出容器名、各级文件夹名和文件名,最后将格式化后的元数据输出到CSV文件或SQL表。
具体实现步骤
1. 配置存储账户链接服务与数据集
- 创建Azure Blob Storage链接服务,关联目标存储账户,确保ADF具备容器访问权限。
- 创建对应数据集:选择
Azure Blob Storage类型,指定目标容器,文件夹路径设为loaded data(注意保留空格)。
2. 初始化管道变量
在目标管道中创建以下变量:
containerName:字符串类型,赋值为你的容器名称(例如my-target-container)。currentFolderPath:字符串类型,初始值设为loaded data,用于存储当前遍历的文件夹路径。metadataList:数组类型,用于收集所有文件的元数据条目。
3. 获取当前文件夹子项
添加Get Metadata活动:
- 数据源选择步骤1创建的数据集,文件夹路径引用变量
@variables('currentFolderPath')。 - 勾选**子项(Child items)**选项,获取当前文件夹下所有文件和子文件夹。
4. 遍历子项并处理
添加ForEach活动:
- 输入项设置为
@activity('你的Get Metadata活动名称').output.childItems。 - 可选:勾选顺序执行,避免多层文件夹并发遍历的冲突。
在ForEach内部添加分支逻辑:
分支1:递归遍历子文件夹
添加If Condition活动,条件表达式:@equals(item().type, 'Folder')
- 条件成立时,添加
Set Variable活动,更新currentFolderPath为@concat(variables('currentFolderPath'), '/', item().name)。 - 调用当前管道自身(递归执行),继续遍历子文件夹内容。
分支2:提取文件元数据
当If Condition判断为文件(@equals(item().type, 'File'))时:
- 添加
Append To Variable活动,向metadataList数组添加格式化后的元数据对象,示例表达式:
注:若文件夹层级超过3级,可按相同格式添加{ "containerName": "@variables('containerName')", "folderLevel1": "@if(greater(length(split(concat(variables('currentFolderPath'), '/', item().name), '/')), 1), split(concat(variables('currentFolderPath'), '/', item().name), '/')[1], '')", "folderLevel2": "@if(greater(length(split(concat(variables('currentFolderPath'), '/', item().name), '/')), 2), split(concat(variables('currentFolderPath'), '/', item().name), '/')[2], '')", "folderLevel3": "@if(greater(length(split(concat(variables('currentFolderPath'), '/', item().name), '/')), 3), split(concat(variables('currentFolderPath'), '/', item().name), '/')[3], '')", "fileName": "@item().name" }folderLevelN字段,确保覆盖所有层级。
5. 输出元数据到目标存储
选项A:输出到CSV文件
- 创建输出数据集:选择
Azure Blob Storage类型,指定CSV文件的存储路径和文件名,格式设置中将分隔符改为|。 - 添加
Copy Data活动:- 源选择Inline Dataset,类型为JSON,数据引用
@variables('metadataList')。 - 目标选择创建的CSV数据集,映射
containerName、folderLevel1等字段,执行后即可生成符合格式的CSV文件。
- 源选择Inline Dataset,类型为JSON,数据引用
选项B:输出到SQL表
- 创建SQL链接服务:关联目标SQL数据库,确保ADF具备表写入权限。
- 创建目标SQL表,示例表结构:
CREATE TABLE FileMetadata ( ContainerName VARCHAR(255), FolderLevel1 VARCHAR(255), FolderLevel2 VARCHAR(255), FolderLevel3 VARCHAR(255), -- 按需添加更多层级字段 FileName VARCHAR(255), LoadTime DATETIME DEFAULT GETDATE() ) - 添加
Copy Data活动:- 源同选项A,引用
metadataList数组作为源数据。 - 目标选择SQL数据集,映射对应字段,执行后元数据将写入SQL表。
- 源同选项A,引用
注意事项
- 递归管道需在设置中开启允许管道调用自身。
- 若文件夹层级极深,需调整管道超时时间,避免执行中断。
- 处理大量文件时,可开启ForEach的并发执行(根据存储账户性能调整并发数)。
内容的提问来源于stack exchange,提问作者vinod kumar reddy konda
相关产品推荐
相关产品推荐

