#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
шаблон:
[
{
"operation": "shift",
"spec": {
"ids":{
"*":{
"id": "ids[amp;1].userId"
}
}
}
}
]
Проще, чем updateRecord