如何限制trident drpc结果只包含拓扑的最后一个函数的字段?

mzillmmw  于 2021-06-21  发布在  Storm
关注(0)|答案(1)|浏览(353)

我在localdrpc中运行了一个简单的三叉戟拓扑,其中一个函数输出 result 字段,但当我运行它时,返回的结果似乎是每个元组的所有信息,而不仅仅是 result 如我所料,给drpc文件。如:

[["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"], ...]

从每个元组获取所有信息是可以的,但是没有迹象表明哪个字段被称为result。从目前的情况来看,它甚至不是有效的json!
那么,如何提取对应于我在拓扑中指定的特定字段的值呢?

3xiyfsfu

3xiyfsfu1#

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

相关问题