如何在apache nifi(jython)中使用executioncript根据条件生成属性?

时间:2017-10-16 12:06:55

标签: apache-nifi

我正在使用apache nifi来存储kafka中的日志。

我有一些日志行,这取决于我必须将它们发送到主题kafka或其他内容。 我遇到的问题是有很多主题,因此我将不得不使用许多处理器。

我认为使用'executioncript',根据日志文本中的条件,我可以生成一个动态属性,我可以在publishkafka处理器的'topic name'属性中使用。

我开始使用代码来读取流文件的内容,以及编写一些条件,但我不知道如何生成属性。

日志行的一些示例: 吉姆,18岁,男,156,俄勒冈州,美国等 约翰,55,M 170,美国爱达荷州等

这是我到目前为止所拥有的:

from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
from org.apache.nifi.processor.io import StreamCallback

class PyStreamCallback(StreamCallback):
    def __init__(self):
         pass
    def process(self, inputStream, outputStream):
         Log = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
         TextLog = str(Log).split(',')
         name = TextLog[0]
         age = TextLog[1]
         sex = TextLog[2]

         if name == 'John' and age == '30':
             Topic_A = str(TextLog) 
             outputStream.write(bytearray((Topic_A).encode('utf-8')))
         elif name == 'Max' and age == '25':
             Topic_B = str(TextLog)
             outputStream.write(bytearray((Topic_B).encode('utf-8')))
         elif name == 'Smith' and age == '10' or '20':
             Topic_C = str(TextLog)
             outputStream.write(bytearray((Topic_C).encode('utf-8')))

目标是拥有一个执行脚本处理器和一个kafka处理器。 拜托,有人可以帮助我。

1 个答案:

答案 0 :(得分:4)

简短的回答是:

flowFile = session.putAttribute(flowFile, 'my-property', 'my-value')

https://funnifi.blogspot.com/2016/02/executescript-processor-hello-world.html

在不编写任何自定义代码的情况下执行此操作的典型方法是使用RouteOnContent ...

您可以添加用户定义的属性,其中名称将成为关系,值为正则表达式。

例如,添加两个属性:

john = John,30,.*
max = Max,25,.*

从那里你可以将每个关系发送到一个UpdateAttribute处理器,你可以在其中设置主题名称,因此john将转到设置topic = Topic_A的UpdateAttribute,而max将转到设置topic = Topic_B的UpdateAttribute。

然后他们都会连接到一个PublishKafka,其主题设置为$ {topic}。