我的数据就像这样..,
[123:1000,156,132,123,156,123]
[123:1009,392,132,123,156,123]
[234:987,789,132,123,156,123]
[234:8765,789,132,123,156,123]
我需要使用nifi中的表达式语言计算每行中存在“123”的次数。
我只需要用表达式语言来做。我怎么算呢?
任何帮助表示感谢。
答案 0 :(得分:2)
根据documentation,计数是这样完成的:
${allMatchingAttributes(".*"):contains("123"):count()}
答案 1 :(得分:2)
您应该使用SplitContent
处理器将流文件内容拆分为每行的单个流文件,然后将ExtractText
与pattern
= (123)?
这样的正则表达式一起使用,这将导致为每个匹配组添加到流文件中的属性:
[123:1009,392,132,123,156,123] -> pattern.1, pattern.2, pattern.3
[234:987,789,132,123,156,123] -> pattern.1, pattern.2
最后,您可以使用ScanAttribute
处理器检测每个流文件中具有最高组计数的属性,并将其路由到UpdateAttribute
以将该值放入公共流文件属性(即count
)。您还可以使用ExecuteStreamCommand
替换某些步骤,并使用各种操作系统级工具(grep
/ awk
/ sed
/ cut
/等。)执行计数,返回该值,并更新流文件的内容。
在ExecuteScript
处理器中执行此计数操作可能更简单,因为它可以在1-2行Groovy,Ruby,Python或Javascript中完成,并且不需要多个处理器。 Apache NiFi专为数据路由和简单转换而设计,而不是复杂的事件处理,因此没有为这些任务开发的标准处理器。 "Add processor to perform simple aggregations"有一个开放的Jira,其中有一个patch available here,可能对您有用。