繁体   English   中英

使用Nifi ExecuteScript处理器生成多个流文件

[英]Generating multiple flowfiles using the Nifi ExecuteScript processor

我正在开发一个Nifi流程,我正在获取一个包含多个键值对的JSON文档。 我正在使用带有pythonExecuteScript处理器。

我的目标是在JSON keys上创建各种URLS。 键是数字的,它们看起来像这样:

keys = [10200, 10201, 10202, ...]

我想要的URL有3种类型,它们应该如下所示:

http://google.com/10200
http://bing.com/10200
http://yahoo.com/10200

我试图循环我的keys[]并为它包含的每个数字键创建3个特定的URL。 我有以下代码,我想:

从列表中读取数字键-->创建3个URL -->吐出流文件。

......并读取列表中的下一个数字键并保持循环.....

我有以下代码,但是当我给它一个JSON流文件时,它现在没有做任何事情。 有人可以告诉我我做错了什么吗?

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

class ModJSON(StreamCallback):

  def __init__(self):
        self.parentFlowFile = None
        pass
  def process(self, inputStream, outputStream):
    text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
    obj = json.loads(text)
    flowfiles_list = [] 

    outputStream.write(bytearray(json.dumps(obj.keys(), indent=4).encode('utf-8')))


    for numerical_key in obj.keys():
      # create 1 flowfile for each numerical_key. Each flow file should have 3 url attributes 
      flowFile = session.create(self.parentFlowFile)
      if (flowFile != None):
        flowFile = session.write(flowFile, "Does not matter")
        flowFile = session.putAttribute(flowFile, "google", "http://google.com/"+ numerical_key)

        flowFile = session.putAttribute(flowFile, "google", "http://bing.com/"+ numerical_key)

        flowFile = session.putAttribute(flowFile, "google", "http://yahoo.com/"+ numerical_key)
        flowfiles_list.append(flowFile)

    for flow in flowfiles_list:
      session.transfer(flow, REL_SUCCESS)

好问题,这是流文件API的Callback方法的细微差别。 您已经创建了StreamCallback的子类,但是您没有检索输入流文件或者使用它来通过类的实例覆盖内容。

在定义ModJSON类之后尝试这个:

originalFlowFile = session.get()
if(originalFlowFile != None):
    originalFlowFile = session.write(flowFile, ModJSON())
    session.remove(originalFlowFile)

这将获得一个输入流文件(或等待一个显示),然后调用您的StreamCallback来覆盖您的流文件的内容。 在我的示例中,您将丢弃输入流文件,因此如果这是您的用例的正确行为,那么您可以只扩展InputStreamCallback而不是StreamCallback并删除outputStream.write(),如果您没有使用outputStream进行任何操作。 为此,请使用InputStreamCallback替换StreamCallback,并从process()方法中删除“outputStream”参数。

在您的示例中,一旦您在上面添加我的代码段,您将使用json.dumps()命令覆盖输入内容,以及创建和传输新文件,所有这些都处于相同的关系(成功),这样可能会导致问题它们的格式不同(这就是我添加session.remove()的原因)。 如果您需要原始流文件与其他文件的关系不同,请考虑使用InvokeScriptedProcessor而不是ExecuteScript。 如果您在处理后不关心输入流文件(添加URL属性),请按照我上面的建议操作。 如果他们都可以发出相同的关系(成功),那么用我的session.remove()替换

session.transfer(originalFlowFile, REL_SUCCESS)

查看我的ExecuteScript cookbook文章( 第2部分 ,共3 部分 ),了解Jython(和其他语言)中这些用例的更多示例:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM