【问题标题】:Apache Nifi: Counting numbers in a string inside a csv fileApache Nifi:计算 csv 文件中字符串中的数字
【发布时间】:2019-10-29 06:56:02
【问题描述】:

我有一个包含两列的 csv。但是downloadupload 列的字符串可以包含多个用逗号分隔的值。

download,upload
"12,3,43","2,33,7,10"
"2,1","4,5,6,23,1"

我需要在字符串中添加每个值,并通过添加形成一个新的 csv。所以在 Nifi 工作流之后,我的输出 csv 必须是:

download,upload
57,52
3,39

基本上应该是每个字符串里面的值相加,如下图。希望您能向我建议要使用的处理器和要更改的配置,以便从输入 csv 实现此输出 csv,如下所示。

【问题讨论】:

  • ExecuteScript 处理器
  • @daggett 这似乎是一条可能的路线。但我不应该在我的项目中使用代码。是否有任何其他处理器或一组处理器可以做到这一点?

标签: csv apache-nifi data-processing


【解决方案1】:

您可以使用 JoltTransformJSON 处理器来实现此目的,该处理器可转换 JSON。它提供了一个splitsum 转换,你需要得到你想要的输出。

策略是:

  • 检查 CSV 文件的每一行
  • 从 CSV 转换为 JSON
  • 应用 Jolt 转换,将字符串拆分、转换为整数并最终求和
  • 将记录转换回 CSV
  • 将记录合并到 CSV 文件中

总流量:

生成流文件:

SplitRecord 将获取每个 CSV 行并将其转换为 JSON:

创建CSVReaderJsonRecordSetWriter。设置 CSVReader 以使用第一行作为标题行。保留默认属性。将每个拆分的记录设置为 1。

使用JoltTransformJson 处理器并提供以下颠簸规范:

[
  {
    "operation": "modify-default-beta",
    "spec": {
      "downloadSplit": "=split(',', @(2,download))",
      "uploadSplit": "=split(',', @(2,upload))"
    }
  }, {
    "operation": "modify-overwrite-beta",
    "spec": {
      "downloadSplit": ["=toInteger", 0],
      "uploadSplit": ["=toInteger", 0]
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "download": "=intSum(@(1,downloadSplit))",
      "upload": "=intSum(@(1,uploadSplit))"
    }
  }, {
    "operation": "shift",
    "spec": {
      "download": "download",
      "upload": "upload"
    }
  }
]
  1. 拆分
  2. 转换为整数
  3. 总和
  4. 用转换后的内容覆盖原始下载/上传

将记录转换回 CSV:

保留读取器和写入器的默认属性。最后将每条记录合并回一个 CSV 文件:

使用具有默认属性的 CSV 读取器和写入器。您可以通过调整MergeRecord 的属性来控制每个 CSV 文件的记录数。阅读更多关于属性 here 的含义。

输出:

请注意,原始行的顺序发生了变化。第一行对应于输入中的最后一行。

【讨论】:

  • 每次拆分的记录在 SplitRecord 处理器中没有定义,是强制性的。
  • @HimsaraGallege 将其设置为 1
  • “SplitRecord”处理器出错,提示“无法解析传入数据。”
  • @HimsaraGallege 您的 CSVReader 配置缺少某些内容。确保将其设置为推断架构并将第一行视为标题行。
猜你喜欢
  • 2016-08-22
  • 2017-03-02
  • 1970-01-01
  • 2015-03-17
  • 2018-04-20
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多