如何在Apache NiFi的Jolt规范中实现指定if else条件逻辑?
Jolt条件逻辑实现方案
需求规则
- 当
credits_type等于MARGIN或为null时,pretax字段取值为cost - 其他场景下,
pretax取值为cost与credits_amount的和
最终Jolt规范
[ { "operation": "shift", "spec": { "*": { "cost": "[&1].cost", "credits_amount": "[&1].credits_amount", "credits_type": "[&1].credits_type", "@cost": "[&1].pretax", "@": "[&1].temp" } } }, { "operation": "modify-overwrite-beta", "spec": { "*": { "pretax": "=ifElse(not(or(eq(@(1,credits_type),'MARGIN'), eq(@(1,credits_type),null))), sum(@(1,cost),@(1,credits_amount)), @(1,pretax))", "temp": "" } } } ]
规范说明
Shift阶段:
- 保留所有原始字段(
cost、credits_amount、credits_type) - 先给
pretax默认赋值为cost,覆盖第一种规则场景 - 将当前完整对象存入
temp字段,为后续条件判断保留数据
- 保留所有原始字段(
Modify阶段:
- 使用
ifElse函数做条件分支判断:- 触发条件:
credits_type既不是MARGIN也不为null - 满足条件时:用
sum函数计算cost与credits_amount的和,替换pretax值 - 不满足条件时:保持
pretax的初始值(即cost)
- 触发条件:
- 删除临时字段
temp,清理输出结构
- 使用
测试验证
场景1:credits_type为MARGIN
输入:
[ { "cost": "10", "credits_amount": "5", "credits_type": "MARGIN" } ]
输出:
[ { "cost": "10", "credits_amount": "5", "credits_type": "MARGIN", "pretax": "10" } ]
场景2:credits_type为其他值
输入:
[ { "cost": "10", "credits_amount": "5", "credits_type": "OTHER" } ]
输出:
[ { "cost": "10", "credits_amount": "5", "credits_type": "OTHER", "pretax": 15 } ]
场景3:credits_type为null
输入:
[ { "cost": "10", "credits_amount": "5", "credits_type": null } ]
输出:
[ { "cost": "10", "credits_amount": "5", "credits_type": null, "pretax": "10" } ]
补充说明
如果需要pretax保持字符串类型(和输入的cost、credits_amount一致),可以将Modify阶段的sum部分改为:
"pretax": "=ifElse(not(or(eq(@(1,credits_type),'MARGIN'), eq(@(1,credits_type),null))), toString(sum(@(1,cost),@(1,credits_amount))), @(1,pretax))"
内容的提问来源于stack exchange,提问作者pandu
相关产品推荐
相关产品推荐

