2

我需要使用 Azure Datafactory 处理容器中的文件,并在下次执行时跟踪处理过的文件。

所以我在数据库中保留了一个存储已处理文件信息的表,在 ADF 中,我正在获取已处理文件的文件名,并且我想检查当前文件是否已被处理。

我正在使用查找活动:获取所有 已处理的文件以使用以下查询从数据库中获取已处理的文件:

select FileName from meta.Processed_Files;

然后我遍历目录,并通过使用获取元数据活动获取目录中当前文件的文件详细信息:“获取迭代中当前文件的详细信息”

在 If Condition 活动中,我使用以下表达式:

@not(contains(activity('Get All Files Processed').output.value,activity('Get Detail of current file in iteration').output.itemName))

即使文件已被处理,这始终返回 True

我们如何比较返回值中的 FileName

活动的输出('获取所有已处理的文件').output.value

{
"count": 37,
"value": [
    {
        "FileName": "20210804074153AlteryxRunStats.xlsx"
    },
    {
        "FileName": "20210805074129AlteryxRunStats.xlsx"
    },
    {
        "FileName": "20210806074152AlteryxRunStats.xlsx"
    },
    {
        "FileName": "20210809074143AlteryxRunStats.xlsx"
    },
    {
        "FileName": "20210809074316AlteryxRunStats.xlsx"
    },
    {
        "FileName": "20210810074135AlteryxRunStats.xlsx"
    },
    {
        "FileName": "20210811074306AlteryxRunStats.xlsx"
    },

活动的输出('获取迭代中当前文件的详细信息').output.itemName

"20210804074153AlteryxRunStats.xlsx"
4

2 回答 2

2

我也经常将这种类型的东西传递给 Azure 数据工厂 (ADF) 中的 SQL,特别是如果我在架构中有一个。但是请记住,ADF 中的任何切换都需要时间,可以使用 来检查数组中是否存在项目contains,例如从Lookup.

背景

普通数组通常看起来像这样:[1,2,3]["a","b","c"],但是如果您考虑在 ADF 中返回的值,例如从查找中返回的值,它们看起来更像这样:

{
    "count": 3,
    "value": [
        {
            "Filename": "file1.txt"
        },
        {
            "Filename": "file2.txt"
        },
        {
            "Filename": "file3.txt"
        }
    ],
    "effectiveIntegrationRuntime": "AutoResolveIntegrationRuntime (North Europe)",
    "billingReference": {
        "activityType": "PipelineActivity",
        "billableDuration": [
            {
...

所以你得到的是一个复杂的 JSON 表示一个对象(Lookup活动的返回值加上一些关于执行的额外有用信息),我们感兴趣的数组在value对象内。然而,它有额外的大括号,即它本身就是一个对象。

解决方案

所以要做的事情是传递给contains看起来像你的对象的东西,它有一个属性Filename。用于concat创建字符串并json使其真实:

@contains(activity('Lookup').output.value, json(concat('{"Filename":"',pipeline().parameters.pFileToCheck,'"}')))

在这里,我使用了一个包含要检查的文件名的参数,但这也可能是一个变量或另一个Lookup活动的输出。

示例输出Lookup

查找输出

Set Variable表达式使用contains

包含表达式

分配给boolean类型变量的结果:

结果

于 2021-09-22T22:15:57.947 回答
0

我尝试过这样的事情。

  1. 从 SQL 表中,将所有已处理的文件作为逗号分隔值select STRING_AGG(processedfile, ',')在查找活动中用作文件

  2. 使用 split 函数将逗号分隔值分配给数组变量(测试) @split(activity('Lookup1').output.value[0]['files'],',')

  3. 获取目录中当前文件的元数据活动

  4. 过滤活动以根据处理的文件过滤当前目录中的文件

项目:

@activity('Get Metadata1').output.childitems

健康)状况:

@not(contains(variables('test'),item().name))
于 2021-09-20T07:38:50.680 回答