我在 adf 中有两个二进制数据集,一个使用 .zip 压缩,第二个 - 不压缩。
因此,我使用这两个数据集作为 CopyData 活动的源和接收器,以将文件解压到 blob 存储上,当我只有一个包含一些文本文件的 zip 文件时,它工作得非常好。
但是当我需要解压缩其中包含另一个 zip 文件的文件时,会发生意外行为。作为预期结果,我希望看到名为主存档的文件夹和其中的一些 zip 存档。
main_archive.zip/
|- nested1.zip
|- nested2.zip
但是我看到的不是 zip 存档,而是名为嵌套 zip 存档的文件夹,以及其中的解压缩文件。
main_archive.zip/
|- nested1.zip/
|- file1.txt
|- nested2.zip/
|- file2.txt
我不确定为什么我会遇到这种情况,而其他人则询问“如何一次解压缩嵌套存档”并得到答复 - “adf 不支持通过一次操作进行嵌套解压缩”。
我需要压缩这些嵌套档案。有什么想法吗?
我已经尝试过你的方案,得到了相同的结果。
它递归地解压缩每个内部 zip 文件。我在 Synapse 集成管道中尝试了相同的场景,在这种情况下也得到相同的结果。
之前,它用于仅解压缩给定的 zip 文件。但目前,尚不确定此行为是新功能还是错误。我在 Github 上提出了一个请求,你可以关注。
由于您的根 zip 文件仅在子文件夹层上包含 zip 文件,因此在这种情况下您可以尝试以下解决方法。此方法从解压缩的文件夹中创建所需的 zip 文件并删除这些文件夹。
复制活动后,使用二进制数据集创建获取元数据活动并设置
ChildItems
字段。 二进制数据集路径应该是您的目标解压缩文件夹,在我的例子中是zipsoutout/mainzip.zip
并且不要提供任何压缩类型。
这将以列表形式给出所有文件夹名称和文件名。使用过滤器活动从此列表中过滤掉解压缩的文件夹名称。文件夹名称末尾带有
.zip
的就是解压后的文件夹。
将以下表达式作为过滤器活动的项目和条件。
Items : @activity('Get Metadata1').output.childItems
condition : @endswith(item().name, '.zip')
现在,将此 Filter 活动输出数组
@activity('Filter1').output.value
赋予 For-each 活动表达式。
在 For-Each 内,进行复制操作以压缩文件夹。使用以下配置将之前在获取元数据活动中使用的相同数据集提供给复制活动源。
@concat('mainzip.zip/',item().name)
创建一个具有相同文件夹路径的新二进制数据集,但对于文件路径,创建一个数据集参数并在文件名中使用该参数。还提供所需的压缩类型。
将此数据集作为复制活动接收器,并使用
@item().name
作为复制活动中的数据集参数。
此复制活动将创建所需的 zip 文件。现在,要删除现有的解压缩文件夹,请使用“删除”活动。这需要另一个二进制数据集。
创建一个数据集参数并在数据集的文件夹名称中使用它,如下所示。
在删除活动中,使用以下表达式作为上述参数的值,并遵循以下配置。
@concat('mainzip.zip/',item().name)
这将删除解压文件夹中的所有内容。当您使用 Blob 存储时,空文件夹将被自动删除。
现在,调试管道,它将创建所需的内部 zip 文件。