2016-11-16 10 views
1

flowアクセスJSON要素とのpython ExecuteScriptプロセッサ

私はPythonとnifiに新しいですを使用してテキストファイルに書き込みます。

私の流れがGETFILEである - スクリプトで> ExecuteScript

、各JSONのために、私は特定の要素をaccesssとラインで、テキストファイルの行にそれを書きたいです。

Iは、以下の試み:

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): 
    pass 
    def process(self, inputStream, outputStream): 
    text = IOUtils.toString(inputStream, StandardCharsets.UTF_8) 
    json_content = json.loads(text) 
    try: 
    body = json_content['id']['body'] 
    body_encoded = body.encode('utf-8') 
    except (KeyError,TypeError,ValueError): 
    body_encoded = '' 

    text_file = open ('/tmp/test/testFile.txt', 'w') 
    text_file.write("%s"%body_encoded) 
    text_file.close() 
    outputStream.write(bytearray(json.dumps(body, indent=4).encode('utf-8'))) 

flowFile = session.get() 
if (flowFile != None): 
    flowFile = session.write(flowFile, ModJSON()) 
    flowFile = session.putAttribute(flowFile, "filename", flowFile.getAttribute('filename').split('.')[0]+'_translated.json') 
session.transfer(flowFile, REL_SUCCESS) 

しかしTESTFILE.TXTに、アクセス本体は書き込まれていません。

私はここで何が恋しいですか?

答えて

3

あなたのPythonクラスの本体はインデントされておらず、いずれもプロセスメソッドの本体ではありません。 のdefの1つのレベルをoutputStream.write行でインデントしてから、text = IOUtils.toString行からoutputStream.write行まで1つレベルをインデントしてください。これにより、実際のStreamCallbackクラスが得られ、スクリプトが生成されます正しく働く

また、スクリプトが完了したときに呼び出されるsession.commit()を呼び出す必要はありません。

EDIT(OP編集 - コメントを参照):上記のスクリプトはまだ正しくインデントされていないため、process()メソッドの本体をインデントする必要があります。 ExecuteScriptプロセッサでエラーや掲示板を取得していますか?着信フローファイルがExecuteScriptの前にキューイングされている場合、 "flowFile = session.get()"が実行されていないか、プロセッサがエラーをスローして掲示板(右上隅に赤いボックス)を表示する必要があります。

また、フローファイル内のプロセッサから同じコンテンツを送信する予定があるので、「text_file」コードは必要ありません。デバッグ用に想定していますか?

+0

ありがとうございました。私は間違って貼り付けた。今私は投稿を編集しました。まだ何も書かれていません。 – vishnu

+0

そのプロセッサから出力されているフローファイルはありますか?そうであれば、そのコンテンツに着信JSONの本文が含まれていますか? – mattyb

+0

これは28のキューに入っていますが、getFileからexecuteScriptへのフローファイルはありません。私も画像を追加しました – vishnu

関連する問題