You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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组合处理器(次优)

若不想编写脚本,可通过组合处理器实现:

  1. UpdateAttribute:将所有datafilename.*属性拼接为一个多值属性(比如all_datafiles,值用逗号分隔)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:15:54