【问题标题】:Nifi: Fastest way to convert deeply nested xml to csv (ExecuteScript vs ExecuteStreamCommand)Nifi:将深度嵌套的 xml 转换为 csv 的最快方法(ExecuteScript 与 ExecuteStreamCommand)
【发布时间】:2019-07-04 08:33:57
【问题描述】:

我一直致力于使用 Nifi 将大型深度嵌套的 xml 文件转换为 csv。

要求是从一个大xml创建许多小表(每个具有不同的列数),所有这些将被合并,或者与特殊字符(如连字符)连接在一起,最终输出一个csv。

但是,我不太确定我的方法是否最佳。

我的 Nifi 管道如下。

  1. 获取文件
  2. ExecuteStreamCommand(python 脚本)
  3. SplitJson
  4. ConvertRecord(Json 到 CSV)
  5. MergeContent(使用 fragment.identifier 策略)
  6. UpdateAttribute(将 csv 扩展名附加到文件名)
  7. 放置文件

我的方法是像下面这样从 xml 创建 json,并在将 json 拆分到每个表后使用控制器服务将 json 转换为 xml。与其从头开始重写 xml,不如简单地创建 {column:value} 字典或 json 更快。

{table1:[{column1:value1,,,column_n:value_n},{},{}]
table2:[{column1:value1,,,,,column_n:value_n},{},{},{},{}]

*每个表的值中list的长度表示csv中的记录数。

当我在本地环境中尝试上述管道时,它处理 250 个 xml 大约 60 秒,每个文件大约 0.25 秒。 但是,当我用 ExecuteScript (Jython) 替换 ExecuteStreamCommand 时,Nifi 并没有达到我预期的更快性能,而是因为内存不足错误而停机。每个文件的处理速度也超过30秒一个文件。

为什么 ExecuteScript (Jython) 在性能方面很差? 如果我必须使用 ExecuteScript,我应该使用 Groovy 还是有更好的方法来进行 csv 转换??

【问题讨论】:

  • 你用 Xml Reader 和 CSV Writer 试过 ConvertRecord processor 吗?
  • 关于性能问题 - 性能取决于代码。并且内存错误与性能无关......
  • 是的,我试过 xml reader 和 csv writter,但我只能使用扁平化的 xml,而不是嵌套的,来应用 xml 读取器。所以重写 xml 比将必要的记录列表作为 json 数据更耗时。
  • 基本上,ExecuteScript 中使用的代码与 ExecuteStreamCommand 中的代码相同。它只是继承和覆盖了Java模块中的streamcallback方法。是不是因为在执行脚本的时候设置了Jython环境,导致性能变慢?或者当有足够的内存和cpu可用时它会更快吗?

标签: python xml csv groovy apache-nifi


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多