如何用Azure Data Factory提取Blob存储中含子文件夹的Zip文件
解决Azure Data Factory提取含嵌套文件夹Zip文件的源解码错误问题
针对你遇到的ADF复制数据活动处理带子文件夹的Zip文件时出现的UserErrorFailedFileOperation源解码错误,以下是几种可行的解决方法:
方法一:调整复制数据活动的源配置
这是最直接的方案,通过修正ADF配置适配嵌套文件夹的Zip文件:
- 源数据集设置:选择Blob存储数据集,将压缩类型设为
ZipDeflate - 源活动配置:
- 在「文件路径」设置中勾选递归选项,确保ADF能遍历Zip内的子文件夹
- 文件名筛选指定目标Zip文件(如
ExportPV.zip) - 切换到「复制行为」标签,将保留层级设为「全部」,确保解压后保留原有的子文件夹结构
方法二:用Azure Function辅助解压
如果方法一仍无法解决,可通过Azure Function实现自定义解压逻辑:
- 创建Blob触发的Azure Function(支持Python/C#),触发条件设为目标Blob容器中新增Zip文件
- 函数核心逻辑:下载Zip文件到临时目录→解压所有文件(含子文件夹)→将解压后的文件按原目录结构上传到指定输出Blob容器
- 示例Python代码片段:
import azure.functions as func import zipfile from azure.storage.blob import BlobServiceClient import os import tempfile def main(myblob: func.InputStream): # 初始化Blob服务客户端 blob_service_client = BlobServiceClient.from_connection_string(os.environ["AzureWebJobsStorage"]) output_container = "your-output-container" output_container_client = blob_service_client.get_container_client(output_container) # 临时目录处理Zip文件 with tempfile.TemporaryDirectory() as temp_dir: zip_file_name = os.path.basename(myblob.name) zip_local_path = os.path.join(temp_dir, zip_file_name) # 下载Zip到本地临时路径 with open(zip_local_path, "wb") as f: f.write(myblob.read()) # 解压所有文件 with zipfile.ZipFile(zip_local_path, 'r') as zip_ref: zip_ref.extractall(temp_dir) # 遍历解压后的文件并上传,保留目录结构 for root, _, files in os.walk(temp_dir): for file in files: if file == zip_file_name: continue local_file_path = os.path.join(root, file) # 计算相对路径,保持原文件夹层级 blob_path = os.path.relpath(local_file_path, temp_dir) blob_client = output_container_client.get_blob_client(blob_path) with open(local_file_path, "rb") as data: blob_client.upload_blob(data, overwrite=True)
- 在ADF中添加「Azure Function活动」,调用该函数完成解压操作
方法三:使用Azure Logic Apps
无需编写代码,通过Logic Apps的内置动作实现解压:
- 创建Logic App,触发方式选择「当Blob添加或修改时(属性仅)」,指向存储Zip文件的Blob容器
- 添加「解压Zip文件」内置动作,选择源Zip文件和目标输出容器,勾选保留文件夹结构选项
- 配置完成后,Logic App会自动监听并处理带嵌套文件夹的Zip文件
注意事项
- 若处理大体积Zip文件,建议使用自托管集成运行时,避免托管运行时的资源限制
- 确保ADF/Function/Logic App拥有Blob存储的读写权限
- 提前验证Zip文件本身无损坏,部分解码错误可能由文件本身问题导致
内容的提问来源于stack exchange,提问作者Hans
相关产品推荐
相关产品推荐

