我正在尝试通过遍历文件夹并将每个文件夹的内容复制到具有文件夹名称的容器中,将文件夹及其文件从 ftp 复制到 azure 数据存储中。为此,我为每个和复制数据组件使用了元数据。现在我可以将所有文件夹复制到同一个容器中,但我想要的是有多个以输出中的文件夹命名的容器,每个容器都包含来自 ftp 的文件。
ps:我对 azure 数据工厂还是新手
非常欢迎任何建议或帮助:)
我正在尝试通过遍历文件夹并将每个文件夹的内容复制到具有文件夹名称的容器中,将文件夹及其文件从 ftp 复制到 azure 数据存储中。为此,我为每个和复制数据组件使用了元数据。现在我可以将所有文件夹复制到同一个容器中,但我想要的是有多个以输出中的文件夹命名的容器,每个容器都包含来自 ftp 的文件。
ps:我对 azure 数据工厂还是新手
非常欢迎任何建议或帮助:)
您需要在 for-each 之前添加一个 Get Metadata 活动。Get Metadata 活动将获取当前目录中的文件并将它们传递给 For-Each。您将其连接到您的 Blob 存储文件夹。
尝试这样的事情
设置 JSON 源:
创建管道,使用GetMetadata 活动列出容器/存储中的所有文件夹。选择字段作为子项
将元数据输出(容器内容列表)输入过滤器活动并仅过滤文件夹。
将文件夹列表输入到 ForEach 活动
在ForEach内部,将当前 item()设置为一个变量,并将其用作参数化源数据集的参数,该数据集是原始源的克隆!
这将导致列出容器中每个文件夹中的文件。
将此提供给另一个过滤器,这次过滤文件。利用@equals(item().type,'File')
现在创建另一个管道,我们将为每个发现与其父文件夹同名的文件运行复制活动。
在新的子管道中创建参数以从父管道接收迭代中的当前文件夹和文件名以评估副本。
在子管道内,从 foreach 开始,其输入将是接收到参数的文件夹内的文件名列表: @pipeline().parameters.filesnamesreceived
使用变量保存当前项目并使用IfCondition检查文件名和文件夹名称是否匹配。
注意:尝试根据您的要求评估删除文件扩展名,因为元数据将包含完整的文件名及其扩展名。
如果 True -> 名称匹配,则从源复制到接收器。
此处保留了层次结构,您还可以使用“前缀”来提及文件路径,因为它使用保留的层次结构进行复制。它利用 Blob 存储的服务端过滤器,提供比通配符过滤器更好的性能。
前缀中最后一个“/”之后的子路径将被保留。例如,您有源容器/文件夹/子文件夹/file.txt,并配置前缀为文件夹/子,则保留的文件路径为子文件夹/文件.txt。这适合您的情况。
这复制文件/source/source/source.json
喜欢/sink/source/source.json
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