如何在Apache NiFi中用JoltTransformJson移除含空字段的FlowFile或对象
解决Apache NiFi中移除含空DOB字段的FlowFile问题
你现在的问题出在两个核心点:一是Jolt规则的结构和Split后的单个对象不匹配,二是JoltTransformJson本身只负责修改JSON内容,不会直接删除FlowFile。下面给你两种可行的解决办法:
方法一:RouteOnAttribute + Delete(最直接高效)
既然已经用SplitJSON把数组拆成了单个员工对象的FlowFile,直接用路由处理器判断DOB是否为null,把符合条件的FlowFile删掉就行:
- 在SplitJSON的下一级添加
RouteOnAttribute处理器 - 在RouteOnAttribute里新增一个属性,比如命名为
DeleteNullDOB,表达式填写${json.DOB:isNull()} - 把RouteOnAttribute的
DeleteNullDOB关系连接到Delete处理器,unmatched关系连接到你后续处理有效数据的处理器
方法二:Jolt配合路由(适合一定要用Jolt的场景)
如果非要用Jolt先处理内容,再判断删除,可以这么操作:
- 修改JoltTransformJson的规则(适配单个员工对象的结构):
[ { "operation": "shift", "spec": { "DOB": { "null": "", // 若DOB为null,不输出任何内容 "*": { "@(2)": "[]" // 若DOB非null,保留整个员工对象 } } } } ] - 后续添加
RouteOnAttribute处理器,新增属性IsEmptyContent,表达式填写${content:isEmpty()} - 把
IsEmptyContent关系连接到Delete处理器,剩余关系连接到后续流程
你之前配置无效的原因
你之前的Jolt规则是针对rowsToRemove数组下的对象设计的,但Split之后每个FlowFile是单独的员工对象(比如{"name":"张三", "DOB":null}),结构完全不匹配,所以只会移除DOB字段,没法处理整个对象;而且Jolt本身没有删除FlowFile的能力,必须配合路由处理器完成过滤删除操作。
内容的提问来源于stack exchange,提问作者lion
相关产品推荐
相关产品推荐

