Вопрос или проблема
Я использую Apache NIFI уже некоторое время и использовал процессор ExecuteScript для сопоставления значений с номерами, используя статические JSON. В процессе ExecuteScript я передаю CSV в качестве входного формата и получаю CSV в качестве выходного формата, поскольку мы используем CSV в качестве формата файла в flowfile, после сопоставления значений многократного выбора он обрабатывается как строка, а не как массив.
Например –
Колонки входного файла:
test1,test2
Shrid,”map1,map2″
Колонки выходного файла:
test1,test2
Shrid,”[1,2]”
Вместо возврата массива объектов он выдаёт строку, что вызывает проблемы при загрузке данных в базу данных.
Как мы можем преобразовать значения из строки в массив объектов в NIFI? Заранее спасибо!
1. Пытался конвертировать значения в целые числа перед загрузкой в базу данных
2. Конвертация данных в формат JSON и использование схемы AVRO для вставки данных
Ответ или решение
Конечно! Проблема, с которой вы столкнулись в Apache NiFi, связана с тем, что значения, которые вы ожидаете как массив объектов, возвращаются как строка. Для решения этой проблемы можно использовать несколько подходов. Позвольте мне предложить вам шаги, которые помогут вам конвертировать строку в массив объектов в формате JSON.
Решение проблемы с преобразованием строки в массив объектов в Apache NiFi:
-
Использование процессора
ReplaceText
:- Добавьте процессор
ReplaceText
перед шагом, где вы загружаете данные в базу данных. - Настройте
Search Value
на регулярное выражение, соответствующее строке, например:"(map1,map2)"
. - В
Replacement Value
указать JSON-формат, который вы хотите получить:["map1", "map2"]
. - Убедитесь, что режим
Replacement Strategy
настроен наAll
.
- Добавьте процессор
-
Использование процессора
ExecuteScript
:- Если вы все еще хотите использовать
ExecuteScript
, вы можете преобразовать строку в массив с помощью JavaScript. -
Пример кода на JavaScript, который можно использовать в процессе:
var input = flowFile.getAttribute('yourAttributeName'); // Получаем атрибут var array = input.split(","); // Преобразуем строку в массив var jsonArray = JSON.stringify(array); // Преобразуем массив в JSON-строку flowFile = session.putAttribute(flowFile, 'yourOutputAttributeName', jsonArray); // Записываем результат в атрибут
- Убедитесь, что вы обрабатываете все атрибуты корректно и возвращаете их обратно в поток.
- Если вы все еще хотите использовать
-
Использование
ConvertJSONToAvro
:- Если вы хотите упростить работу с данными, вы можете преобразовать данные в JSON-формат и использовать процессор
ConvertJSONToAvro
. - Для этого вы можете сначала преобразовать данные в формат JSON с помощью процессора
ConvertTextToJSON
. Затем используйтеConvertJSONToAvro
, чтобы создать сложные структуры, включая массивы.
- Если вы хотите упростить работу с данными, вы можете преобразовать данные в JSON-формат и использовать процессор
- Завершение и проверка:
- После преобразования данных в массив объектов убедитесь, что выходной файл имеет правильный формат. Для проверки можно использовать процессор
LogAttribute
, чтобы просмотреть содержимое переменных и атрибутов потока. - Проверьте, что массив объектов корректно воспринимается при загрузке в вашу базу данных.
- После преобразования данных в массив объектов убедитесь, что выходной файл имеет правильный формат. Для проверки можно использовать процессор
Эти шаги помогут вам решить проблему с преобразованием строк в массив объектов в Apache NiFi. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их!