如何限制Trident DRPC结果以包含仅拓扑的最后一个函数的字段?

时间:2014-10-02 14:58:39

标签: java apache-storm trident

我在LocalDRPC中运行了一个简单的Trident拓扑,其中一个函数输出result字段,但是当我运行它时,我得到的结果似乎是来自每个元组的所有信息而不仅仅是我在DRPC docs给出的result字段。例如:

[["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!

那么如何提取与我在拓扑中指定的特定字段相对应的值?

1 个答案:

答案 0 :(得分: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