Azure Data Factory如何递归获取嵌套JSON文件路径并遍历复制?
解决ADF中递归获取分层JSON文件路径并遍历复制的问题
针对你在Azure Data Factory中遇到的无法用Get Metadata递归获取container/../../year=2023/m=1/d=01/h=01/m=5/file.json这类分层文件路径的问题,给出以下几种可行方案:
方案1:正确配置Get Metadata + ForEach实现递归遍历
如果之前的Get Metadata未生效,大概率是配置细节没到位,按以下步骤调整:
- 数据集配置:将源数据集的文件路径设置为通配符格式,比如
container/你的父路径/year=2023/**(**表示递归匹配所有子层级),或更精确的container/你的父路径/year=2023/*/*/*/*/*(匹配年→月→日→小时→5分钟的所有层级) - Get Metadata活动设置:
- 选择上述数据集作为源
- 在「字段」选项中勾选
childItems - 将「递归」开关设为
True
- ForEach活动遍历:
- 把ForEach的项设置为
@activity('Get Metadata活动名称').output.childItems - 在ForEach内部添加Copy活动,将源数据集的文件路径参数设为
@item().path(或@item().name,根据实际返回字段调整),目标端按需配置
- 把ForEach的项设置为
方案2:多层ForEach参数化遍历(适合结构固定的分层路径)
因为你的文件路径严格按年(固定2023)→月→日→小时→5分钟分层,可通过嵌套ForEach逐层枚举:
- 第一层ForEach(月份):项设为
[1,2,3,4,5,6,7,8,9,10,11,12],遍历1-12月 - 第二层ForEach(天数):项用表达式动态生成对应月份的天数(2023是平年,2月取28天):
@range(1, if(equals(item(),2),29,if(or(equals(item(),4),equals(item(),6),equals(item(),9),equals(item(),11)),31,32))) - 第三层ForEach(小时):项设为
@range(0,24),遍历0-23小时 - 第四层ForEach(5分钟间隔):项设为
[0,5,10,15,20,25,30,35,40,45,50,55],遍历所有5分钟节点 - Copy活动参数化:在Copy活动的源数据集路径中,用表达式拼接完整路径:
(注意根据嵌套层级调整@concat('container/你的父路径/year=2023/m=', string(activity('第一层ForEach').items[activity('第一层ForEach').currentIndex]), '/d=', string(item()), '/h=', string(activity('第三层ForEach').items[activity('第三层ForEach').currentIndex]), '/m=', string(item()), '/file.json')item()的引用)
方案3:用Lookup活动查询存储账户获取所有文件路径
如果是Blob Storage或ADLS Gen2,可通过Lookup活动执行查询获取所有文件路径:
- Lookup活动配置:
- 源数据集选择你的存储账户,格式设为「CSV」(仅用于占位,实际不解析内容)
- 在「查询」选项中输入:
SELECT name FROM OPENROWSET( BULK 'container/你的父路径/year=2023/**', FORMAT = 'CSV', FIELDTERMINATOR = '0x0b', FIELDQUOTE = '0x0b' ) WITH (name varchar(1000)) AS [result] - 启用「递归」选项
- 遍历复制:将ForEach的项设为
@activity('Lookup').output.value,Copy活动源路径设为@item().name
方案4:Azure Function辅助获取文件路径
如果以上方法都不适用,可编写一个简单的Azure Function(如C#或Python),调用Azure Storage SDK递归遍历指定路径下的所有文件,返回路径列表:
- Function逻辑:连接存储账户,遍历
year=2023下的所有层级,收集所有file.json的完整路径 - 在ADF中添加Web活动,调用这个Function,获取返回的路径数组
- 将Web活动的输出传给ForEach,遍历执行Copy活动
内容的提问来源于stack exchange,提问作者MK93
相关产品推荐
相关产品推荐

