Azure 数据工厂 v2 从具有不同文件名和结构的数据湖中摄取文件

azure data factory v2 ingest files from data lake with different filenames and structure

我的任务是从数据湖存储中提取平面文件。

它们是多个文件,将存储在同一个逻辑文件夹中。 这些文件的内容和结构是不同的。 每次添加与前一个文件具有相同结构的新文件时,文件名都会不同。 例如

filename_1.csv

内容结构

col1, col2, col3

下次上传同一个文件不同数据时,可以调用

january_new-data-1.csv

我已经为每个文件创建了汇表。

如何创建 adF 管道以动态摄取这些文件? 有可能吗?

我在想这些文件需要先分离到它们自己的逻辑文件夹中,是吗?

是的,我们可以动态获取这些文件。这些文件不需要先分离到它们自己的逻辑文件夹中。我创建了一个简单的测试。根据文件中的列数通过一个管道复制到不同的tables。
我创建了两个 table,一个有 3 列,另一个有 4 列:

CREATE TABLE [dbo].[emp_stage](
    [id] [int] NULL,
    [name] [nvarchar](max) NULL,
    [age] [nvarchar](max) NULL
)

CREATE TABLE [dbo].[Entities](
    [id] [int] NULL,
    [name] [varchar](25) NULL,
    [age] [int] NULL,
    [city] [varchar](100) NULL
)

在ADF中,我们可以通过Switch判断不同的列数来进行不同的复制活动activity。

  1. 我的数据湖“输入”容器中有两个 csv 文件。 emp.csv包含3列,其对应的table名称为[dbo].[emp_stage]january_new-data-1.csv包含4列,其对应的table名称为[dbo].[Entities].

  2. 所以我创建了一个数据集来“输入”容器。添加动态内容 *.csv 和 select First row as header

  3. 使用Get MetaData1 activity获取子项。 子项目如下:

  4. 使用Foreach1activity,添加动态内容@activity('Get Metadata1').output.childItems.

  5. Foreach1 activity 中,我们可以创建一个数据集并键入动态内容 @item().name。我们可以将文件名动态传递给Get Metadata2activity。 这样我们就可以在容器中动态指定一个文件了。

  6. 使用Switch1activity,添加表达式@string(activity('Get Metadata2').output.columnCount)Get Metadata2activity的输出转换为字符串类型。 Get Metadata2 activity 将获取指定文件的列数。

  7. 我会在这里得到两个案例,'3'和'4'。所以默认是'3',我们会转到Copy activity1.

  8. 当情况'4'时,我们将转到Copy activity2Copy activity1Copy activity2 使用相同的数据源。我们之前在第 5 步定义的这个数据源。它们下沉到不同的 tables。

  9. 调试后,我可以在我的table中看到结果。