在Azure Data Factory中解压嵌套双层压缩文件的技术咨询
Azure Data Factory: 双层压缩文件解压 + 外层解压出二进制文件的解决方案
一、先搞定外层解压出无用二进制文件的问题
出现这种情况大概率是两个原因:
- 压缩格式不兼容:ADF原生解压活动仅支持 Zip、GZip、BZip2、Tar 四种格式。如果你的外层包是RAR、7Z这类非支持格式,ADF会把它当成普通二进制文件解压,自然得到一堆无法识别的内容。这种情况必须先转格式,或者用自定义逻辑处理。
- 解压设置匹配错误:检查解压活动的「压缩类型」选项,不要选自动检测(偶尔会失效),手动选择和外层包一致的格式。同时确认源数据集的路径确实指向正确的外层压缩包,没选错文件。
二、双层解压的实现流程(以双层Zip为例)
假设内外层都是ADF支持的格式,按以下步骤搭建流水线:
1. 解压外层包到临时目录
- 新建解压活动:源数据集指向你的外层压缩文件,目标数据集选一个临时Blob文件夹(比如
temp/outer_unpacked/)。记得把解压活动的「行为」设为覆盖现有文件,避免残留旧文件干扰。 - 成功后,临时目录里应该能看到所有内层压缩包(比如
inner_01.zip、inner_02.zip),如果还是二进制,回到第一步排查格式问题。
2. 获取内层压缩文件列表
- 添加Get Metadata活动:源数据集指向刚才的临时目录,「字段列表」只勾选
childItems,这样就能拿到目录下所有内层文件的名称和路径。
3. 循环解压每个内层包
- 加一个For Each活动,循环输入设为
@activity('Get Metadata').output.childItems(替换成你的Get Metadata活动名称)。 - 在For Each内部再放一个解压活动:
- 源数据集要做参数化:在源数据集的文件路径里新增一个参数
InnerFileName,然后在解压活动的源数据集参数中赋值@item().name,这样每次循环都会指向当前的内层压缩包。 - 目标数据集选最终的存储目录,也可以按内层文件名自动建子文件夹(比如
final/unpacked/@{item().name}/),防止不同内层包的文件重名覆盖。
- 源数据集要做参数化:在源数据集的文件路径里新增一个参数
可选:清理临时文件
如果不需要保留外层解压后的临时文件,最后加一个Delete活动,指向临时目录,删除所有内容即可。
三、非ADF支持格式的处理办法
如果内外层有RAR/7Z这类格式,ADF原生搞不定,得用Azure Function:
- 写个Python或C#的Function,用第三方库实现解压(比如Python用
pyunpack+patool处理7Z/RAR,注意在Function环境里安装依赖)。 - 在ADF里调用这个Function:先传外层包路径解压得到内层文件,再循环传内层包路径二次解压;或者在同一个Function里直接实现双层解压逻辑,一次性搞定。
内容的提问来源于stack exchange,提问作者Celeye
相关产品推荐
相关产品推荐

