问题描述
它们是多个文件,将存储在同一个逻辑文件夹中。 这些文件的内容和结构是不同的。 每次添加一个与前一个结构相同的新文件时,文件名都会不同。 例如。
filename_1.csv
内容结构
col1,col2,col3
january_new-data-1.csv
我已经为每个文件创建了接收器表。
如何创建 adF 管道以动态摄取这些文件? 甚至有可能吗?
解决方法
是的,我们可以动态摄取这些文件。这些文件不需要先分离到它们自己的逻辑文件夹中。我创建了一个简单的测试。通过一个管道根据文件中的列数复制到不同的表。
我创建了两个表,一个有 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 活动判断不同列的数量来执行不同的复制活动。
-
我的数据湖“输入”容器中有两个 csv 文件。
emp.csv
包含 3 列,其对应的表名是[dbo].[emp_stage]
。january_new-data-1.csv
包含 4 列,其对应的表名是[dbo].[Entities]
。 -
使用
Foreach1
活动,添加动态内容@activity('Get Metadata1').output.childItems
。 -
在
Foreach1
活动中,我们可以创建数据集并键入动态内容@item().name
。我们可以将文件名动态传递给Get Metadata2
活动。 这样我们就可以动态指定容器中的一个文件。 -
使用
Switch1
活动,添加表达式@string(activity('Get Metadata2').output.columnCount)
将Get Metadata2
活动的输出转换为字符串类型。Get Metadata2
活动将获取指定文件的列数。 -
当情况为“4”时,我们将转到
Copy activity2
。Copy activity1
和Copy activity2
使用相同的数据源。我们之前在第 5 步定义的这个数据源。它们下沉到不同的表。