将文件夹复制到 Azure 数据存储(Azure 数据工厂)

Copy folders into Azure data storage (azure data factory)

我正在尝试将文件夹及其文件从 ftp 复制到 Azure 数据存储中,方法是遍历文件夹并将每个文件夹的内容复制到具有文件夹名称的容器中。为此,我为每个和复制数据组件使用了元数据。现在我可以将所有文件夹复制到同一个容器中,但我想要的是有多个容器以输出中的文件夹命名,每个容器包含 ftp.

中的文件

ps : 我对 Azure 数据工厂还是新手

非常欢迎任何建议或帮助:)

AzCopy 是比数据工厂更简单的解决方案,干 运行 可用于检查哪些 files/folders 将被复制

az storage blob copy start \
  --destination-container destContainer \
  --destination-blob myBlob \
  --source-account-name mySourceAccount \
  --source-account-key mySourceAccountKey \
  --source-container myContainer \
  --source-blob myBlob

您需要在 for-each 之前添加一个获取元数据 activity。 Get Metadata activity 将获取当前目录中的文件并将它们传递给 For-Each。您将它连接到您的 Blob 存储文件夹。

尝试这样的事情

设置一个JSON来源:

创建管道,使用GetMetadata activity列出container/storage中的所有文件夹。 Select 字段作为 childItems

将元数据输出(容器内容列表)输入 过滤器 activity 并仅过滤文件夹。

将文件夹列表输入 ForEach activity

ForEach 中,将 current item() 设置为一个变量,并将其用作参数化源数据集的参数是原始来源的克隆!

这将导致列出容器中每个文件夹中的文件。

将其提供给另一个过滤器,这次是对文件进行过滤。使用 @equals(item().type,'File')

现在创建另一个管道,我们将 copy activity 运行 用于发现与其父文件夹同名的每个文件.

在新的子管道中创建 参数 以从父管道接收迭代中的当前文件夹和文件名以评估复制。

在子管道中,从 foreach 开始,其输入将是接收到参数的文件夹内的文件名列表:@pipeline().parameters.filesnamesreceived

使用变量保存当前项目并使用 IfCondition 检查文件名和文件夹名是否匹配。

Note: Try to evaluate dropping the file extension as per your requirement as metadata would hold the complete file name along with its extension.

如果为 True -> 名称匹配,则从源复制到接收器。

此处保留了层次结构,您还可以使用“前缀”提及文件路径,因为它复制时保留了层次结构。它利用服务端过滤器进行 Blob 存储,提供比通配符过滤器更好的性能。

前缀中最后一个“/”之后的子路径将被保留。比如你有sourcecontainer/folder/subfolder/file.txt,配置prefix为folder/sub,那么保存的文件路径就是subfolder/file.txt。哪个适合您的场景。

这会将 /source/source/source.json 之类的文件复制到 /sink/source/source.json