需要将数据加载到名称不匹配的目标表中

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

我正在使用 Azure Data Lake Storage Gen2,遇到的挑战涉及使用 Azure 数据工厂的复制活动将数据动态加载到 SQL 数据库中。情况是这样的:

ADLS Gen2 中的文件:

  1. DESCRIPTION_CANDIDATENOTES_20231026.txt
  2. DC_RESUMEPDFs_20231026.txt
  3. DESCRIPTION_Job_Index_20231026.txt

对应的目标SQL表名称:

  1. 描述_候选人注释
  2. 描述_恢复
  3. DESCRIPTION_JOB

对于复制活动,我已参数化表名称并将值设置为

@concat(replace(item().name,'_20231026.txt',''))

此设置通过删除 _20231026.txt 成功加载 DESCRIPTION_CANDIDATENOTES 表的数据。但是,它不适用于其他两个表,因为它们的文件名与删除后缀后的表名不直接匹配。

如何修改表达式或设置以动态删除文件名的适当部分并将它们正确映射到所有文件的相应表名?

azure
1个回答
0
投票

根据您的源文件和目标表名称,您可以使用以下逻辑来实现这种情况下的要求。

此外,您还提到您的目标 SQL 表已经创建。因此,在获取源文件路径列表后,使用 SQL 数据集的查找活动。在查找活动查询中,给出以下查询。

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES;

enter image description here

这将以 JSON 数组的形式列出所有目标表名称。

然后使用 For-Each 活动并将源文件名数组提供给 For-Each 表达式

在 For-Each 内,使用设置变量活动将当前文件名存储在字符串变量中。

enter image description here

要在过滤器活动中使用当前文件名,您可以使用上述变量。

接下来,获取 Filter 活动并为其提供以下表达式。

Items : @activity('Lookup1').output.value
Condition : @startswith(join(skip(split(variables('curr_filename'),'_'),1),'_'), join(skip(split(item().TABLE_NAME,'_'),1),'_'))

enter image description here

上述过滤活动将通过检查当前文件名的某些部分是否以表名的某些部分开头来过滤出所需的表名。

在每次迭代中,都会过滤掉需要的表名。例如,如果当前文件名是

DC_RESUMEPDFs_20231026.txt
,它将在过滤器活动输出中给出所需的表名称。

enter image description here

在 For-Each 内部,过滤器活动之后,您可以对源数据集和目标数据集进行带有数据集参数的复制活动。

在复制活动中使用以下表达式作为源文件名和目标表名称。

Source file name : @item().name
Target table name : @activity('Filter1').output.value[0].TABLE_NAME

在每次迭代中,过滤活动将给出所需的表名称,复制活动将源文件复制到目标表。

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