如果您只是想在一个 bang (!) 上拆分并且只保留文本 在 之后,那么您可以通过将 SplitContent 配置为:
Byte Sequence Format: Text
Byte Sequence: !
Keep Byte Sequence: false
将RouteOnAttribute 配置为:
Routing Strategy: Route to Property name
Add a new dynamic property called "substring_after" with a value: ${fragment.index:equals(2)}
对于您的输入,这将产生 2 个流文件 - 一个带有之前的子字符串!一个在 ! 之后带有子字符串。第一个 FlowFile(之前的子字符串)将从 RouteOnAttribute 路由到 unmatched 关系,而第二个 FlowFile(之后的子字符串)将路由到 substring_after强>关系。您可以自动终止不匹配的关系以删除您不想要的文本。
不过,这种方法也有缺点。
- 你保证只有一个!在内容?您将如何处理多个?
- 您正在将某些 JSON 上的子字符串作为原始文本。分裂开!将导致在字符串末尾留下一个 "}。
这些看起来像日志条目,您可能需要考虑查看 ConsumeKafkaRecord 并利用 NiFi 的 Record 功能更智能地解释和操作数据。
关于脚本,有一些很棒的 NiFi 脚本学习食谱,从这里开始:https://community.cloudera.com/t5/Community-Articles/ExecuteScript-Cookbook-part-1/ta-p/248922
编辑:
鉴于您的更新,我会将UpdateRecord 与 JSON 读取器和写入器一起使用,并将 Replacement Value Strategy 设置为 Record Path Value 。
这使用RecordPath 语法对记录中的数据执行转换。您的 JSON 对象是一条记录。这将允许您在同一个流文件中拥有多个记录(而不是每个流文件 1 行)。
然后,向 UpdateRecord 添加一个动态属性:
姓名: /标记名
值: substringAfter(/Tagname, '!' )
这是在做什么?
属性的名称 (/Tagname) 是 JSON 中 Tagname 键的 RecordPath。这告诉 UpdateRecord 将结果放在哪里。在您的情况下,我们正在替换现有键的值(但如果您想添加一个,它也可以是一个新键)。
属性的 Value 是要评估的表达式,以构建您要插入的值。我们正在使用 substringAfter 函数,它有 2 个参数。第一个参数是记录中包含输入字符串的键的记录路径,它也是/Tagname(我们将标记名的值替换为原始标记名值的子字符串)。第二个参数是要拆分的字符串,即!。