首页 > 解决方案 > 将源文件中的列与接收器表列匹配,以确保它们使用 Azure 数据工厂匹配

问题描述

我有一个 Azure 数据工厂触发器,当文件放入 blob 存储时会触发该触发器,此触发器将启动管道执行并将文件名传递给数据流活动。我想确保文件中标题行的所有列名都在接收器表中。接收器表中有一个标识列不应该在比较中。不知道如何处理这项任务,我已经阅读了“派生列”活动,这是我应该采取的路线吗?

标签: azure-data-factoryazure-data-factory-2azure-data-flow

解决方案


战略:

使用两个 ADF 管道,一个用于获取所有文件的列表,另一个用于处理每个文件,将其内容复制到特定的 SQL 表。

设置:

我按照您需要的模式创建了 4 个 CSV 文件:“[CustomerID] [TableName] [FileID].csv”和 4 个 SQL 表,每种类型的文件一个。

  • A_inventory_0001.csv:客户 A 的库存记录,要插入到 SQL 表“A_Inventory”中。
  • A_sales_0003.csv:客户 A 的销售记录,要插入到 SQL 表“A_Sales”中。
  • B_inventory_0002.csv:客户 B 的库存记录,要插入到 SQL 表“B_Inventory”中。
  • B_sales_0004.csv:客户 B 的销售记录,插入到 SQL 表“B_Sales”中</li>

战略

关联服务

在 Azure 数据工厂中,使用 Key Vault 创建了以下链接服务(Key Vault 是可选的)。

关联服务

数据集

创建了以下数据集。请注意,我们创建了一些参数以允许管道指定源文件和目标 SQL 表。

数据集“AzureSQLTable”有一个参数来指定目标 SQL 表的名称。

数据集-AzureSQLTable

数据集“DelimitedTextFile”有一个参数来指定源 CSV 文件的名称。

数据集分隔文本文件

数据集“DelimitedTextFiles”没有参数,因为它将用于列出源文件夹中的所有文件。

数据集分隔文本文件

管道

第一个管道“获取文件”将从源文件夹(获取元数据活动)获取 CSV 文件列表,然后,对于每个文件,调用第二个管道,将 CSV 文件名作为参数传递。

管道-GetFiles1

管道-GetFiles2

在 foreach 循环中,调用了第二个管道“Process File”,将文件名作为参数传递。

管道-GetFiles3

第二个管道有一个参数“pFileName”来接收要处理的文件的名称和一个变量来根据文件名计算目标表的名称。

管道-ProcessFile1

第一个活动是在文件名中使用拆分来提取我们需要组成目标表名的部分。在下面的表达式中,我们使用“__”分隔符拆分文件名,然后使用第一部分和第二部分组成目标表名。 @concat(string(split(pipeline().parameters.pFileName, '_')[0]),'_',string(split(pipeline().parameters.pFileName, '_')[10]))

管道-ProcessFile2

然后第二个活动将使用动态映射将文件从源“pFileName”复制到目标表“vTableName”,即不添加特定列名,因为这将是动态的。

管道-ProcessFileCopy

我在此示例中使用的文件和 ADF 代码可在此处获得: https ://github.com/diegoeick/stack-overflow/tree/main/69340699

我希望这能解决您的问题。

如果您仍需要将 CustomerID 和 FileID 保存在数据库表中,您可以使用动态映射并使用可用参数(文件名)并在复制活动的映射选项卡中创建一个带有动态映射的 json。您可以在此处找到更多详细信息:https ://docs.microsoft.com/en-us/azure/data-factory/copy-activity-schema-and-type-mapping#parameterize-mapping


推荐阅读