Нифи: Самый быстрый способ конвертировать глубоко вложенный XML в CSV (ExecuteScript против ExecuteStreamCommand) - PullRequest
0 голосов
/ 04 июля 2019

Я работал над преобразованием большого размера глубоко вложенного xml-файла в csv, используя Nifi.

Требуется создать много маленьких таблиц (каждая с разным количеством столбцов) из одного большого xml,все они будут объединены или объединены вместе со специальным символом (например, дефисом) для вывода одного CSV в конце.

Но я не совсем уверен, является ли мой подход оптимальным или нет.

Мой конвейер Nifi выглядит следующим образом.

  1. GetFile
  2. ExecuteStreamCommand (скрипт Python)
  3. SplitJson
  4. ConvertRecord (Json to CSV)
  5. MergeContent (со стратегией frag.identifier) ​​
  6. UpdateAttribute (добавление расширения csv к имени файла)
  7. PutFile

Мой подход заключается в создании jsonиз xml, как показано ниже, и используйте службу контроллера для преобразования json в xml после разделения json на каждую таблицу.Вместо того, чтобы переписывать xml с нуля, просто создать словарь {column: value} или json было гораздо быстрее.

{table1: [{column1: значение1 ,,, column_n: значение_n}, {}, {}]
table2: [{column1: значение1 ,,,,, column_n: значение_n}, {}, {}, {}, {}]

* Длина списка в значении каждой таблицы представляет количество записей в CSV.

Когда я пробовал вышеуказанный конвейер в локальной среде, он обрабатывал250 xml для грубых 60 секунд, около 0,25 секунд на файл.Однако, когда я заменил ExecuteStreamCommand на ExecuteScript (Jython), вместо более высокой производительности, которая, как я ожидал, Nifi упала из-за ошибки нехватки памяти.Скорость обработки каждого файла также составляла более 30 секунд только для одного файла.

Почему ExecuteScript (Jython) плох с точки зрения производительности ??Должен ли я использовать Groovy, если мне нужно использовать ExecuteScript, или есть ли лучший подход для преобразования CSV ??

1 Ответ

0 голосов
/ 09 июля 2019

Документация объясняет, что 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

...