Apache Nifi:UpdateRecord替换子值

时间:2019-03-22 11:07:06

标签: apache replace apache-nifi

我正在尝试使用UpdateRecord 1.9.0处理器来修改JSON,但是它并不能替换我想要的值。

这是源消息

{
    "type": "A",
    "ids": [{
            "id": "1",
            "value": "abc"
        }, {
            "id": "2",
            "value": "def"
        }, {
            "id": "3",
            "value": "ghi"
        }
    ]
}

和所需的输出

{
    "ids": [{
            "userId": "1",
        }, {
            "userId": "2",
        }, {
            "userId": "3",
        }
    ]
}

我已按以下方式配置了处理器 processor config

读者: reader

架构注册表: schema

作家: writer

它起作用了,输出是一个没有字段'type'的JSON,并且id具有字段'userId'而不是'id'和'value'。

要填充userId的值,我定义了替换策略和要替换的属性: strategy

但是输出错误。 userId始终用数组中最后一个元素的ID填充:

{
    "ids": [{
            "userId": "3"
        }, {
            "userId": "3"
        }, {
            "userId": "3"
        }
    ]
}

我认为表达式的值还可以,因为如果我尝试只替换一条记录,它就可以正常工作(/ids[0]/userId, ..id

Nifi文档有一个非常相似的示例(示例3): https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.7.1/org.apache.nifi.processors.standard.UpdateRecord/additionalDetails.html

但这对我不起作用。

我在做什么错了?

谢谢

1 个答案:

答案 0 :(得分:1)

最后,我使用JoltJSONTransform处理器而不是UpdateRecord

JoltJSONTransform

模板:

[
    {
        "operation": "shift",
        "spec": {
            "ids":{
                "*":{
                    "id": "ids[&1].userId"
                }
            }
        }
    }
]

比UpdateRecord更容易