簡體   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