NiFi Jolt类型转换后能否执行数值运算?差值计算示例
问题说明
原始JSON数据如下:
[ { "dst_cnt": "149125" }, { "src_cnt": "149136" }, { "TABLENAME": "NAME" } ]
需求是通过NiFi的Jolt对其中的dst_cnt与src_cnt执行减法运算,请问完成类型转换后,Jolt是否支持此类数据运算?
解答
Jolt本身不支持算术运算,哪怕完成了字符串到数值的类型转换也不行——Jolt的核心定位是JSON结构的重组、字段映射与简单类型转换,不包含数值计算的功能。
要实现减法运算,需要结合NiFi的其他处理器配合完成,步骤参考:
- 先调整结构+类型转换:用
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" }
- 执行减法运算:
- 方案一:使用
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
相关产品推荐
相关产品推荐

