NiFi SplitJson处理器JsonPath不存在时抛警告的解决方法
Apache NiFi SplitJson 路径不存在冗余警告规避方案
核心思路
在FlowFile进入SplitJson处理器前增加前置校验与路由,将目标JsonPath不存在、目标字段为空的FlowFile提前分流,不送入SplitJson处理,从根源消除触发警告日志的条件。
落地步骤
- 上游新增
EvaluateJsonPath处理器做路径存在性判断
核心配置如下:Destination选择flowfile-attribute,不会修改原始FlowFile内容- 新增自定义属性:属性名可自定义为
target_path_valid,对应JsonPath表达式填写$.Payload.ProfileScores.scoreList Path Not Found Behavior、Path is Null Behavior两个配置项均设置为empty string,此时如果目标路径不存在、字段为null/空,对应属性会被赋值为空字符串,处理器本身不会抛出任何异常或警告
- 下游新增
RouteOnAttribute处理器做流量分流
配置路由规则:- 新增规则命名为
to_split,匹配表达式为${target_path_valid:isEmpty():not()},所有命中该规则的FlowFile都是目标路径存在、值非空的有效数据 - 未命中规则的FlowFile会自动归入
unmatched关系,可根据业务需求走空值处理、异常归档等分支,绝对不要送入SplitJson
- 新增规则命名为
- 路由关系接线
将RouteOnAttribute的to_split关系连接到原有SplitJson处理器,SplitJson保持原有$.Payload.ProfileScores.scoreList[*]配置不变即可。此时进入SplitJson的所有FlowFile都满足路径存在的前提,完全不会触发路径不存在的警告日志。
替代简化方案
如果不想拆分多步路由,也可以直接在SplitJson前加JoltTransformJSON做数据兜底:
配置Jolt转换规则,给目标路径设置空数组默认值,SplitJson处理空数组时不会抛出路径不存在的警告,仅会无拆分输出原始FlowFile,不会产生冗余日志。
参考Jolt Spec代码:
[ { "operation": "default", "spec": { "Payload": { "ProfileScores": { "scoreList": [] } } } } ]
注意:如果上游数据中
ProfileScores可能为空字符串而非null,需要先在Jolt前接入UpdateRecord处理器做预处理,将/Payload/ProfileScores字段的替换规则设置为${field.value:isEmpty():ifElse(null, field.value)},把空字符串转为null后,default规则才能正常生效补全空数组。
内容的提问来源于stack exchange,提问作者Arjun Arora
相关产品推荐
相关产品推荐

