首页 > 解决方案 > Azure 数据工厂:来自输入数据集文件夹名称的输出数据集文件名

问题描述

我正在尝试解决 Azure 数据工厂中的以下场景:

我在 Azure Blob 存储中有大量文件夹。每个文件夹包含不同数量的镶木地板格式的文件。文件夹名称包含生成文件夹中包含的数据的日期,如下所示:DATE=2021-01-01。我需要过滤文件并将它们以分隔格式保存到另一个容器中,并且每个文件的文件名中都应包含源文件夹名称中指示的日期。

所以当我的输入看起来像这样时......

DATE=2021-01-01/
    data-file-001.parquet
    data-file-002.parquet
    data-file-003.parquet
DATE=2021-01-02/
    data-file-001.parquet
    data-file-002.parquet

...我的输出应该是这样的:

output-data/
    data_2021-01-01_1.csv
    data_2021-01-01_2.csv
    data_2021-01-01_3.csv
    data_2021-01-02_1.csv
    data_2021-01-02_2.csv

从子文件夹中读取文件并过滤它们并保存它们很容易。当我尝试动态设置输出数据集文件名时,问题就开始了。我可以使用 Get Metadata 活动获取文件夹名称,然后可以使用 ForEach 活动将它们设置为变量。但是,我无法弄清楚如何在过滤数据流汇数据集时使用此变量。

标签: azureazure-data-factoryazure-data-factory-2

解决方案


更新:
我的Get Metadata1活动,将容器设置input为:
在此处输入图像描述 将容器设置input如下:
在此处输入图像描述 我的调试信息如下: 在此处输入图像描述

我想我已经找到了解决方案。例如,我正在使用 csv 文件。
我的输入看起来像这样

container:input 
    2021-01-01/
      data-file-001.csv
      data-file-002.csv
      data-file-003.csv
    2021-01-02/
      data-file-001.csv
      data-file-002.csv

我的调试结果如下:
在此处输入图像描述

在此处输入图像描述

  1. 使用Get Metadata1活动获取文件夹列表,然后使用ForEach1活动迭代此列表。
    在此处输入图像描述

  2. ForEach1活动内部,我们现在使用数据流来移动数据。
    在此处输入图像描述

  3. 将源数据集设置为容器并声明一个参数FolderName在此处输入图像描述

  4. 然后将动态内容添加@dataset().FolderName到源数据服务器。 在此处输入图像描述

  5. 回到活动,我们可以给参数ForEach1添加动态内容。 @item().nameFolderName在此处输入图像描述

  6. 键入File_Name选项卡。它将文件名存储为列,例如。/2021-01-01/data-file-001.csv. 在此处输入图像描述

  7. 然后我们可以通过处理这个列来得到我们想要的文件名DerivedColumn1。添加了表达式concat('data_',substring(File_Name,2,10),'_',split(File_Name,'-')[5])在此处输入图像描述

  8. 在 sink 的设置中,我们可以选择Name file as column dataFile_Name在此处输入图像描述

就这样。


推荐阅读