Я работал над преобразованием большого размера глубоко вложенного xml-файла в csv, используя Nifi.
Требуется создать много маленьких таблиц (каждая с разным количеством столбцов) из одного большого xml,все они будут объединены или объединены вместе со специальным символом (например, дефисом) для вывода одного CSV в конце.
Но я не совсем уверен, является ли мой подход оптимальным или нет.
Мой конвейер Nifi выглядит следующим образом.
- GetFile
- ExecuteStreamCommand (скрипт Python)
- SplitJson
- ConvertRecord (Json to CSV)
- MergeContent (со стратегией frag.identifier)
- UpdateAttribute (добавление расширения csv к имени файла)
- 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 ??