Apache NiFi中基于Jolt实现条件保留/丢弃数据及值异常解决
Jolt条件过滤:保留匹配数据/丢弃不匹配数据
业务需求
对输入JSON的键值对执行条件判断:
- 若
SourceNameCopy的值为network或hardware,则保留整条原始数据 - 若不匹配,则丢弃整条数据(返回
null)
输入JSON
{ "id": 30006, "SourceName": "network", "Number": 1, "SourceNameCopy": "network", "currenttime": "Thu Aug 30 21:19:27 IST 2022" }
当前使用的Jolt规则(存在问题)
[ { "operation": "shift", "spec": { "SourceNameCopy": { "network": { "@1": "&2", "#id": "id", "#SourceName": "SourceName", "#Number": "Number", "#currenttime": "currenttime" }, "hardware": { "@1": "&2", "#id": "id", "#SourceName": "SourceName", "#Number": "Number", "#currenttime": "currenttime" } } } } ]
现有问题
当前规则中使用#key的写法是硬编码字符串值,导致输出的字段值都是字段名本身(比如id字段的值是字符串"id",而非原始数据的30006),不符合预期。
修复后的Jolt规则
要实现匹配时保留原始数据,不匹配返回null,可以通过shift操作结合根路径引用实现:
[ { "operation": "shift", "spec": { "SourceNameCopy": { "network|hardware": { "@2": "" } } } }, { "operation": "default", "spec": null } ]
规则说明
- shift操作:
network|hardware用于匹配SourceNameCopy的目标值,支持多值匹配@2表示向上回溯2层路径,直接引用整个原始输入的JSON对象""将匹配到的原始数据赋值给根节点,最终输出完整原始数据
- default操作:
- 当
shift操作无匹配结果时,自动将输出设置为null,实现不匹配时丢弃数据的需求
- 当
测试结果
- 当
SourceNameCopy为network或hardware时,输出与原始输入完全一致 - 当
SourceNameCopy为其他值时,输出null
内容的提问来源于stack exchange,提问作者samrathal
相关产品推荐
相关产品推荐

