ADF CopyActivity 递归解压缩存档,但不需要

问题描述 投票:0回答:1

我在 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 不支持通过一次操作进行嵌套解压缩”。

我需要压缩这些嵌套档案。有什么想法吗?

azure zip azure-data-factory azure-blob-storage azure-storage
1个回答
0
投票

我已经尝试过你的方案,得到了相同的结果。

enter image description here

它递归地解压缩每个内部 zip 文件。我在 Synapse 集成管道中尝试了相同的场景,在这种情况下也得到相同的结果

之前,它用于仅解压缩给定的 zip 文件。但目前,尚不确定此行为是新功能还是错误。我在 Github 上提出了一个请求,你可以关注。

由于您的根 zip 文件仅在子文件夹层上包含 zip 文件,因此在这种情况下您可以尝试以下解决方法。此方法从解压缩的文件夹中创建所需的 zip 文件并删除这些文件夹。

复制活动后,使用二进制数据集创建获取元数据活动并设置

ChildItems
字段。 二进制数据集路径应该是您的目标解压缩文件夹,在我的例子中是
zipsoutout/mainzip.zip
并且不要提供任何压缩类型

enter image description here

这将以列表形式给出所有文件夹名称和文件名。使用过滤器活动从此列表中过滤掉解压缩的文件夹名称。文件夹名称末尾带有

.zip
的就是解压后的文件夹。

将以下表达式作为过滤器活动的项目和条件。

Items : @activity('Get Metadata1').output.childItems

condition : @endswith(item().name, '.zip')

enter image description here

现在,将此 Filter 活动输出数组

@activity('Filter1').output.value
赋予 For-each 活动表达式。

在 For-Each 内,进行复制操作以压缩文件夹。使用以下配置将之前在获取元数据活动中使用的相同数据集提供给复制活动源。

@concat('mainzip.zip/',item().name)

enter image description here

创建一个具有相同文件夹路径的新二进制数据集,但对于文件路径,创建一个数据集参数并在文件名中使用该参数。还提供所需的压缩类型。

enter image description here

将此数据集作为复制活动接收器,并使用

@item().name
作为复制活动中的数据集参数。

enter image description here

此复制活动将创建所需的 zip 文件。现在,要删除现有的解压缩文件夹,请使用“删除”活动。这需要另一个二进制数据集。

创建一个数据集参数并在数据集的文件夹名称中使用它,如下所示。

enter image description here

在删除活动中,使用以下表达式作为上述参数的值,并遵循以下配置。

@concat('mainzip.zip/',item().name)

enter image description here

这将删除解压文件夹中的所有内容。当您使用 Blob 存储时,空文件夹将被自动删除。

现在,调试管道,它将创建所需的内部 zip 文件。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.