2017-09-08 3 views
0

私はnifiのExecuteScript Processorからデータを抽出し、フローファイルに属性としてアタッチしようとしています。私はそこに多くの情報源、特にMatt Burgessのfunnifi blogのものを試しました。続きExecuteScriptでNifiがエラーになる

これはpythonである私のコード

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 

originalFlowFile = session.get() 
text = IOUtils.toString(originalFlowFile) 
log.info(text) 

if(originalFlowFile != None): 
    event = json.loads(text) 
    if (event['true'] == 'Y'): 
     flowfile = session.putAttribute(flowfile, "true", "Y") 
    elif (event['src'] == 'ONE'): 
     allAttributes = { "true": "N", "src": "ONE" } 
     flowfile = session.putAllAttributes(flowfile, allAttributes) 
    elif (event['src'] == 'TWO'): 
     allAttributes = { "true": "N", "src": "TWO" } 
     flowfile = session.putAllAttributes(flowfile, allAttributes) 
    session.transfer(flowFile, REL_SUCCESS) 
    session.commit() 

です。フローファイルのデータはJSONです。それでも、私はそれを解析することができません。

INFO部分が非常に高く評価されるであろう

text = IOUtils.toString(originalFlowFile) 

The error I am getting

すべてのヘルプの出力です。

P.S.フローファイルにIOUtils.toStringを()を呼び出す

import json 
import java.io 
from org.apache.commons.io import IOUtils 

originalFlowFile = session.get() 

if(originalFlowFile != None): 
    inputStream = session.read(originalFlowFile) 
    text = IOUtils.toString(inputStream) 
    log.info(text) 
    event = json.loads(text) 
    if (event['true'] == 'Y'): 
     flowfile = session.putAttribute(flowfile, "true", "Y") 
    elif (event['src'] == 'ONE'): 
     allAttributes = { "true": "N", "src": "ONE" } 
     flowfile = session.putAllAttributes(flowfile, allAttributes) 
    elif (event['src'] == 'TWO'): 
     allAttributes = { "true": "N", "src": "TWO" } 
     flowfile = session.putAllAttributes(flowfile, allAttributes) 
    session.transfer(flowFile, REL_SUCCESS) 
    session.commit() 
+0

エラー '' jsonオブジェクトがデコードできません 'は、フローファイルの内容にjsonオブジェクトがないことを意味します。あなたの質問を更新し、追加することができます:1)フローファイルの内容。 2)あなたのスクリプトで何をしたいのか。なぜあなたはそれに精通していないときにPythonを選択するのですか? – daggett

+0

私はjavascriptを使いたかったのですが、これはオプションでは利用できません!サンプルデータは、今追加しています.... –

+0

目的はデータをチェックし、データポイントを取得して別のストリームを作成し、それを属性として追加することです。 –

答えて

3

:私はまだ動作しないのpython

テストデータ

{ 
    "true":"N", 
    "src":"ONE", 
    "var1":"value1", 
    "var2":"value2" 
} 

UPDATE

私の更新されたコード、に慣れていませんよフローファイルがInputStream、Reader、またはそれ自身で読むことができるものではないので、それ自体は動作しない可能性があります。私は実際にはラインが例外を生成しないことに驚いています。

あなたはフローファイルの内容を得ることができる二つの方法...

は、最初のセッションからフローファイルのためのInputStreamを取得することであります。

originalFlowFile = session.get(); 
inputStream = session.read(originalFlowFile); 
text = IOUtils.toString(inputStream); 

秒ですInputStreamCallbackを使用しています:

flowFile = session.read(flowFile, {inputStream -> 
    // read the inputStream 
} as InputStreamCallback); 
+0

No JSONをデコードすることができないという同じエラーを取得する最初の方法を試しました。しかし、私はカフカのコンテンツを見ています...データはJSONです...私は更新されたコードを追加しました。テストjsonは –

+0

と同じですので、log.info(テキスト)を実行するとjsonがnifi-app.logに出力されますか? –

+0

NiFi UIを使用してフローフイルムの内容を調べることもお勧めします。スクリプトプロセッサを停止したままにして、その直前のキューにいくつかのフローファイルを作成させてから、キューを右クリックしてList Queueを実行してから、エントリの1つを選択してドリルインして、 jsonがそこにいる。 –

関連する問題