0

関数の 1 つがフィールドを出力する LocalDRPC で実行されている単純なトライデント トポロジがありますが、それを実行すると、返される結果は、フィールドresultだけではなく、すべてのタプルからのすべての情報であるように見えます。 DRPC docsresultを考えると予想されます。例えば:

[["http:\/\/www.smbc-comics.com\/rss.php",http://www.smbc-comics.com/rss.php,[#document: null],[item: null],[link: null],[description: null],http://feedproxy.google.com/~r/smbc-comics/PvLb/~3/CBpJmAiJSxs/index.php,http://www.smbc-comics.com/comics/20141001.png,"http:\/\/www.smbc-comics.com\/comics\/20141001.png"], ...]

すべてのタプルからすべての情報を取得することは問題ありませんが、どのフィールドが結果と呼ばれるかを示すものはありません。現状では、有効な JSON でさえありません!

では、トポロジで指定した特定のフィールドに対応する値を抽出するにはどうすればよいでしょうか?

4

1 に答える 1

1

Storm は、実行チェーン中に処理されたすべてのフィールドを Json 配列で返します。値の順序は処理された順序と同じであるため、最後の関数のみの結果に関心がある場合は、配列から最後の値のみを読み取る必要があります。何らかの理由で中間結果に関心がない場合は、射影法で制限できます。たとえば、ストリームがある場合:

stream.each(new Fields("args"), new AddExclamation(), new Fields(EX_1))
    .each(new Fields(EX_1), new AddPlus(), new Fields(P1, P2));

それが返す

[["hello","hello!1","hello!1+1","hello!1+2"],["hello","hello!2","hello!2+1","hello!2+2"]]

次に、投影を設定することにより、P2に制限できます

stream.each(new Fields("args"), new AddExclamation(), new Fields(EX_1))
    .each(new Fields(EX_1), new AddPlus(), new Fields(P1, P2))
    .project(new Fields(P2));

出力はこれだけになります

[["hello!1+2"],["hello!2+2"]]

ここで実際にこれを見ることができます:

https://github.com/ExampleDriven/storm-example/blob/master/src/test/java/org/exampledriven/ExclamationPlusTridentTopologyTest.java

于 2014-10-03T15:02:36.740 に答える