如果源中没有可用,ADF 复制会主动添加附加列

问题描述 投票:0回答:1

我有 10 个文件,它们的列数不同,但所有文件的目标都是相同的。 因为我们知道复制活动总是在源和目标中寻找相同数量的列,所以我的计划是在复制活动中动态添加列并将 null 传递给目标,如果不添加,我们是否有任何方法可以动态创建comumn来自源文件。

我尝试了多种方法,但每次遇到意外类型“|List`1”时都不起作用错误

azure azure-data-factory
1个回答
0
投票

复制活动无法根据目标数据动态添加列。相反,您可以使用数据流来实现此目的。

为此,创建 3 个数据集。

  • 一个是源文件列表。在此仅给出直到源文件夹的路径。

  • 第二个也用于源,但在这里,创建一个数据集参数

    filename
    并将其用作数据集的文件名
    @dataset().filename

    enter image description here

  • 最后一个数据集用于目标文件。给出该数据集中的目标文件路径。

这些是我的示例源文件:

样本1.csv

col4,col3,col2,col5,col1
mycol4,1,22,mycol5,B
mycol4,2,23,mycol5,B

样本2.csv

col8,col3,col2,col9,col4
mycol8,1,22,mycol9,mycol4
mycol8,2,23,mycol9,mycol4

样本3.csv

col1,col3,col2,col6,col7,col8
Rakesh,1,22,2000-16-02,B,C
Laddu,2,23,2001-16-03,B,C
MS,3,42,1981-07-07,B,C

在目标 csv 文件中,我只获取了标题。您的目标文件可能包含数据。

col1,col2,col3,col4,col5,col6,col7,col8,col9

在数据流中,将目标数据集作为一个源,将带参数的源数据集作为另一个源。

在目标数据集源中,导入投影并确保所有数据类型与源数据匹配。这里,我将所有数据类型设置为字符串。

enter image description here

在源中,不要导入任何投影并清除数据集中的模式。

enter image description here

TargetAsSource 之后进行联合转换,并通过 Name 将其与 Source 联合。

enter image description here

接下来添加水槽。接收器数据集应该是目标数据集。转到接收器设置 -> 将文件名称选项设置为输出到单个文件,并在输出到单个文件选项中给出实际的文件名。

enter image description here

现在,创建一个管道并使用之前创建的第一个源数据集执行“获取元数据”活动。在“获取元数据”活动的字段中,输入 ChildItems。这将给出源文件夹中的所有文件名列表。

在此之后进行 For-Each 活动,并将子项数组

@activity('Get Metadata1').output.childItems
从此传递给 for-each 表达式。确保选中 For-Each 活动中的 Sequential 复选框。

在 For-Each 内,获取数据流活动并将上述数据流提供给它。将

@item().name
指定给源数据集参数,如下所示。

enter image description here

现在,调试管道,所有源文件数据将被合并,并在管道运行后添加具有空值的所需列。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.