【问题标题】:Azure Data Factory - copy activity if file not found in database tableAzure 数据工厂 - 如果在数据库表中找不到文件,则复制活动
【发布时间】:2021-09-15 02:04:48
【问题描述】:

我正在尝试将 Azure Datalake 中的 csv 文件中的数据复制到 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"
        }
    ],

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

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

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

IfCondition 的逻辑:

@not(contains(activity('Database Table File Lookup').output.value, item().name))

【问题讨论】:

  • 好问题!非常详细。我有类似的问题。希望你能尽快得到答复;)

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


【解决方案1】:

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

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

[
        {
            "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))

【讨论】:

  • 有帮助,但循环的复杂度并不理想。
【解决方案2】:

根据Microsoft 上有关表达式的一些信息以及@anupam 的评论,我将数组转换为字符串以进行字符串与子字符串的比较。这简化了@Anupams 的回答,因为不需要另一个forEach

@not(contains(string(activity('Survey Details File Lookup').output.value), item().name))

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2020-12-13
    • 2020-09-15
    • 2021-07-02
    • 2021-12-17
    • 2022-11-11
    • 2019-03-28
    • 2022-06-30
    相关资源
    最近更新 更多