ADF Copy Activity通配符路径问题:仅复制Data Lake Gen2指定JSON文件
解决方案:仅复制ADLS Gen2嵌套JSON文件(忽略文件夹结构)
一、使用AzCopy(推荐,高效直接)
AzCopy的--flat参数可直接扁平化复制所有匹配文件,不保留源文件夹结构:
- 基础命令(匹配所有年份的JSON文件):
azcopy copy "https://<你的存储账户>.dfs.core.windows.net/<容器名>/Folder1/Folder2/Folder3/Folder4/Folder5/**/*.json" "https://<目标存储账户>.dfs.core.windows.net/<目标容器>/目标文件夹/" --recursive --flat=true
**:匹配任意层级的子文件夹*.json:只筛选JSON文件--flat=true:强制所有文件直接放到目标目录,不创建嵌套结构
- 过滤特定年份(比如仅2022、2023年):
azcopy copy "https://<你的存储账户>.dfs.core.windows.net/<容器名>/Folder1/Folder2/Folder3/Folder4/Folder5/{2022,2023}/**/*.json" "https://<目标存储账户>.dfs.core.windows.net/<目标容器>/目标文件夹/" --recursive --flat=true
二、使用Azure Data Factory(企业级集成场景)
在ADF复制活动中配置扁平化复制:
- 配置源数据集:
- 容器和根路径设为
Folder1/Folder2/Folder3/Folder4/Folder5 - 文件路径的通配符设置:
- 文件夹路径:填
**(匹配所有子层级)或*/*/*/*/*(精确匹配年份/月份/日期/小时/分钟五层) - 文件名:填
*.json
- 文件夹路径:填
- 容器和根路径设为
- 配置复制活动设置:
- 进入设置选项卡,找到保留层级,选择不保留层级
- 过滤特定年份:
- 直接修改源数据集的根路径为
Folder1/Folder2/Folder3/Folder4/Folder5/2022(仅2022年),或用{2022,2023}匹配多个年份 - 也可在源选项卡中添加筛选器,按文件夹名称或文件创建时间过滤
- 直接修改源数据集的根路径为
三、使用PowerShell(灵活自定义场景)
适合需要更复杂过滤逻辑的场景:
# 配置参数 $storageAccountName = "你的存储账户名" $sourceContainer = "源容器名" $sourceRootPath = "Folder1/Folder2/Folder3/Folder4/Folder5" $targetContainer = "目标容器名" $targetRootPath = "目标文件夹" # 递归获取所有JSON文件 $jsonFiles = Get-AzDataLakeGen2ChildItem -AccountName $storageAccountName ` -FileSystem $sourceContainer ` -Path $sourceRootPath ` -Recurse -File | Where-Object { $_.Name -match "\.json$" } # 逐个复制到目标目录(自动去重同名文件,可按需修改) foreach ($file in $jsonFiles) { Copy-AzDataLakeGen2Item -AccountName $storageAccountName ` -FileSystem $sourceContainer ` -Path $file.Path ` -DestFileSystem $targetContainer ` -DestPath "$targetRootPath/$($file.Name)" }
常见问题排查
- 仅复制部分文件:检查通配符是否正确,
*仅匹配当前层级,**才匹配所有子层级;确保没有权限限制,比如部分文件夹无读取权限 - 仍复制文件夹结构:确认是否开启了扁平化参数(AzCopy的
--flat=true、ADF的“不保留层级”)
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

