You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NiFi Jolt类型转换后能否执行数值运算?差值计算示例

问题说明

原始JSON数据如下:

[
  {
    "dst_cnt": "149125"
  },
  {
    "src_cnt": "149136"
  },
  {
    "TABLENAME": "NAME"
  }
]

需求是通过NiFi的Jolt对其中的dst_cnt与src_cnt执行减法运算,请问完成类型转换后,Jolt是否支持此类数据运算?

解答

Jolt本身不支持算术运算,哪怕完成了字符串到数值的类型转换也不行——Jolt的核心定位是JSON结构的重组、字段映射与简单类型转换,不包含数值计算的功能。

要实现减法运算,需要结合NiFi的其他处理器配合完成,步骤参考:

  1. 先调整结构+类型转换:用JoltTransformJSON处理器,先把数组中的分散字段合并到单个对象中,同时将字符串类型的计数转成整数。对应的Jolt规范示例:
[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "dst_cnt": "=toInteger",
      "src_cnt": "=toInteger"
    }
  }
]

处理后得到的JSON结构:

{
  "dst_cnt": 149125,
  "src_cnt": 149136,
  "TABLENAME": "NAME"
}
  1. 执行减法运算:
    • 方案一:使用ExecuteScript处理器,通过脚本语言(比如Groovy)实现计算。示例Groovy脚本:
    def flowFile = session.get()
    if (!flowFile) return
    
    flowFile = session.write(flowFile, { inputStream, outputStream ->
        def json = new groovy.json.JsonSlurper().parse(inputStream)
        json.count_diff = json.src_cnt - json.dst_cnt
        outputStream.write(new groovy.json.JsonBuilder(json).toByteArray())
    } as StreamCallback)
    
    session.transfer(flowFile, REL_SUCCESS)
    
    • 方案二:使用UpdateRecord处理器,配合NiFi表达式语言(EL)直接计算。在Record Reader和Record Writer配置正确的前提下,新增字段的表达式可以写为:${src_cnt:toNumber()} - ${dst_cnt:toNumber()}(如果之前没做类型转换,也可以在这里直接转类型后计算)。

内容的提问来源于stack exchange,提问作者Yono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:36:53