【问题标题】:Copy folders into Azure data storage (azure data factory)将文件夹复制到 Azure 数据存储(Azure 数据工厂)
【发布时间】:2021-10-21 00:51:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: foreach azure-data-factory azure-blob-storage copydataset


    【解决方案1】:

    AzCopy 是比数据工厂最简单的解决方案,可使用试运行来检查将复制哪些文件/文件夹

    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
    

    【讨论】:

    • 在目标中,我不希望所有文件夹都复制到同一个容器中,而是每个容器有一个文件夹..这是我无法复制文件的地方
    【解决方案2】:

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

    试试这样的

    设置 JSON 源:

    创建一个管道,使用 GetMetadata 活动 列出容器/存储中的所有文件夹。选择字段作为 childItems

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

    将文件夹列表输入到 ForEach 活动

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

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

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

    现在创建另一个管道,我们将为每个发现与其父文件夹同名的文件运行复制活动

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

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

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

    注意:尝试根据您的要求评估删除文件扩展名,因为元数据将包含完整的文件名以及 它的扩展名。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 2021-11-25
      • 2016-08-30
      • 1970-01-01
      • 2017-03-06
      • 2015-12-17
      • 2020-12-22
      • 2020-06-04
      相关资源
      最近更新 更多