от
Я работал над преобразованием большого размера глубоко вложенного XML-файла в CSV, используя Nifi. Требуется создать много маленьких таблиц (каждая с разным количеством столбцов) из одного большого xml, все из которых будут объединены или объединены вместе со специальным символом (например, дефисом) для вывода одного csv в конце. Но я не совсем уверен, является ли мой подход оптимальным или нет. Мой конвейер Nifi выглядит следующим образом. Получить файл ExecuteStreamCommand (скрипт Python) SplitJson ConvertRecord (от Json до CSV) MergeContent (со стратегией фрагмента. Идентификатор) UpdateAttribute (добавление расширения csv к имени файла) PutFile Мой подход заключается в создании json из xml, как показано ниже, и использовании службы контроллера для преобразования json в xml после разделения json на каждую таблицу. Вместо того, чтобы переписывать xml с нуля, просто создать словарь {column: value} или json было гораздо быстрее. {Таблица1: [{столбец1: значение1 ,,, column_n: value_n}, {}, {}]           таблица2: [{столбец1: значение1 ,,,,, column_n: value_n}, {}, {}, {}, {}] * Длина списка в значении каждой таблицы представляет количество записей в CSV. Когда я попробовал описанный выше конвейер в локальной среде, он обрабатывал 250 xml примерно 60 секунд, примерно 0,25 секунды на файл. Однако, когда я заменил ExecuteStreamCommand на ExecuteScript (Jython), вместо более высокой производительности, которая, как я ожидал, Nifi упала из-за ошибки нехватки памяти. Скорость обработки каждого файла также составляла более 30 секунд всего одним файлом. Почему ExecuteScript (Jython) плох с точки зрения производительности ?? Должен ли я использовать Groovy, если мне нужно использовать ExecuteScript, или есть ли лучший подход для преобразования CSV ??              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.

1 Ответ

0 голосов
от
Документация объясняет, что ExecuteScript является экспериментальным. ExecuteStreamCommand больше подходит для ваших целей   Выполняет внешнюю команду для содержимого файла потока и создает новый файл потока с результатами команды. https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-standard-nar/1.5.0/org.apache.nifi.processors.standard.ExecuteStreamCommand/index.html https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-scripting-nar/1.5.0/org.apache.nifi.processors.script.ExecuteScript/index.html     
...