如何基于ExtractText动态属性将单个FlowFile拆分为多个副本?
Apache NiFi:按正则匹配属性拆分FlowFile并保留父属性
完全可以实现你的需求,以下是几种高效的实现方案,按推荐优先级排序:
方案1:使用ExecuteScript处理器(最优)
通过Groovy脚本遍历所有datafilename.*属性,为每个属性生成一个携带父FlowFile全部属性的副本,同时可将当前文件名存入指定属性(比如target_datafile),方便下游使用。
配置步骤:
- 选择Groovy作为脚本语言
- 输入如下脚本:
import org.apache.nifi.processor.io.StreamCallback import java.nio.charset.StandardCharsets def flowFile = session.get() if (!flowFile) return // 筛选所有datafilename相关属性 def dataFileAttrs = flowFile.attributes.findAll { it.key.startsWith('datafilename') } dataFileAttrs.each { attr -> // 创建FlowFile副本,继承所有父属性 def newFlowFile = session.clone(flowFile) // 添加或覆盖当前目标文件名属性(可选,方便下游识别) newFlowFile = session.putAttribute(newFlowFile, 'target_datafile', attr.value) // 发送副本到成功关系 session.transfer(newFlowFile, REL_SUCCESS) } // 移除原FlowFile(如果不需要保留) session.remove(flowFile)
- 配置成功关系(REL_SUCCESS)到下游处理器
这种方式性能最优,直接通过NiFi API操作,避免不必要IO,逻辑灵活可按需调整。
方案2:使用SplitAttribute组合处理器(次优)
若不想编写脚本,可通过组合处理器实现:
- UpdateAttribute:将所有
datafilename.*属性拼接为一个多值属性(比如all_datafiles,值用逗号分隔) - SplitAttribute:开启
Split into Separate FlowFiles选项,将all_datafiles拆分为单个值的属性,每个值对应一个FlowFile副本,自动保留原属性
此方案无需编码,但需额外属性拼接步骤,灵活性和性能略逊于脚本方案。
方案3:RouteOnText(不推荐)
RouteOnText基于FlowFile内容路由拆分,若用它实现需求,需先将属性写入FlowFile内容再拆分,会引入不必要的IO操作,性能远低于前两种方案,不建议使用。
最终流程示例:
传入FlowFile1 → ExtractText(提取datafilename.*属性) → ExecuteScript(拆分生成FlowFile1.1、FlowFile1.2...) → 下游处理器
内容的提问来源于stack exchange,提问作者StrangerThinks
相关产品推荐
相关产品推荐

