首页 > 解决方案 > Azure 数据工厂 - 如果在数据库表中找不到文件,则复制活动

问题描述

我正在尝试将csvAzure Datalake 中找到的文件中的数据复制到 SQL Server 中的表中。作为条件,我只想通过使用在数据库表中找到的文件名列来复制数据库中尚不存在的文件。以下是我的尝试(我无法在互联网上找到这样的示例)。

我首先使用一个Get Metadata活动来检索数据湖中的所有文件。同时,我使用一个Lookup活动来获取所选表中的不同文件名。第一张图片显示了活动的组织。

在此处输入图像描述

以下是Get MetadataLookup活动的输出。

Datalake 文件元数据输出

{
    "childItems": [
        {
            "name": "surveydetails_eq5d_001.csv",
            "type": "File"
        },
        {
            "name": "surveydetails_koos_001.csv",
            "type": "File"
        },
        {
            "name": "surveydetails_oxford_001.csv",
            "type": "File"
        },
        {
            "name": "surveydetails_womac_001.csv",
            "type": "File"
        }
    ],

数据库表文件查找

{
    "count": 4,
    "value": [
        {
            "file_name": "surveydetails_koos_001.csv"
        },
        {
            "file_name": "surveydetails_oxford_001.csv"
        },
        {
            "file_name": "surveydetails_eq5d_001.csv"
        },
        {
            "file_name": "surveydetails_womac_001.csv"
        }
    ],

获得文件名后,我使用 aForEach并迭代 Datalake 项目:

@activity('Datalake Files Metadata').output.childitems

在里面ForEach我有一个IfCondition检查当前 Datalake 文件是否在 Lookup 数组中。如果 Datalake 文件不在阵列中,则执行复制活动。但是,使用此构造,我不希望复制任何内容,因为数据湖中的项目已经在数据库中。我感觉里面的动态内容IfCondition已经关闭,但是在网上搜索了最后几个小时后,我找不到任何明显的错误。IfCondition off 中有逻辑吗?是别的吗?请帮忙。

逻辑IfCondition

@not(contains(activity('Database Table File Lookup').output.value, item().name)) 在此处输入图像描述

标签: azureazure-data-factoryazure-data-factory-2

解决方案


Ifcondition 逻辑有 item().name,它返回一个等于文件名的字符串(示例 --> “surveydetails_eq5d_001.csv”)。

但是,activity('Database Table File Lookup').output.value 返回一个字典数组。在字典中是“file_name”+ 文件名。IE

[
        {
            "file_name": "surveydetails_eq5d_001.csv"
        },
        {
            "file_name": "surveydetails_koos_001.csv"
        },
        {
            "file_name": "surveydetails_oxford_001.csv"
        },
        {
            "file_name": "surveydetails_womac_001.csv"
        }
]

这就是 IF 条件失败的原因。

您可以尝试创建 2 个新数组 dblist 和 mytemparray 变量。遍历 Activity('Database Table File Lookup').output.value 的数组并将每个文件名提取到新的 dblist 数组中(您可以为此使用“union”)。然后,您可以在 Ifcondition 检查中使用此数组。不要忘记将 for 循环上的“Sequential”开关设置为 ON。请参阅屏幕截图。在此处输入图像描述

在我的 for 循环中,我有 2 个设置变量活动。

  1. 活动 1:将 dblist 复制到 mytemparray
  2. 活动 2:将 mytemparray 与 file_name 组合并存储在 dblist @union(variables('mytemparray'),array(item().file_name))

推荐阅读