Apache Nifi: запись обновления заменяет дочерние значения

#apache #replace #apache-nifi

#apache #заменить #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",
        }
    ]
}
  

Я настроил процессор следующим образом
конфигурация процессора

Считыватель: считыватель

Реестр схемы: схема

автор: writer

И это работает, на выходе получается JSON без поля ‘type’, а идентификаторы содержат поле ‘userId’ вместо ‘id’ и ‘value’.

Чтобы заполнить значение userId, я определил стратегию замены и свойство для замены: strategy

Но вывод неверен. Идентификатор пользователя всегда заполняется идентификатором последнего элемента в массиве:

 {
    "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:

Наконец, я использовал процессор JoltJSONTransform вместо updateRecord

JoltJSONTransform

шаблон:

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

Проще, чем updateRecord