风暴多领域分组

时间:2015-04-16 17:06:31

标签: apache-storm trident stream-processing

我想要做的是将流分组为两个字段("remote-client-ip", "request-params"),并计算每个组中的元组数。并将它们组合成一张地图。这是我的拓扑结构:

topology.newStream("kafka-spout-stream-1", repeatSpout)
                    .each(new Fields("str"), new URLParser(), new   Fields(fieldNames))
                    .each(new Fields("remote-client-ip", "request-params"), new HTTPParameterExtractor(), new Fields("query-string"))
                    .groupBy(new Fields("remote-client-ip", "query-string"))
                    .aggregate(new Fields("remote-client-ip", "query-string"), new Count(), new Fields("user-word-count"))
                    .groupBy(new Fields("remote-client-ip"))
                    .persistentAggregate(new MemoryMapState.Factory(), new UserQueryStringCombiner(), new Fields("user-word-count-list"));

但是在调试之后,我发现数据流在第一个groupBy()处被阻止,这是一个多字段分组。我在后续的聚合语句中没有为Count()执行任何操作。

所以我认为我误解了关于多字段分组和聚合之间交互的一些概念。

请告诉我我的猜测是对还是错。 谢谢!

1 个答案:

答案 0 :(得分:1)

您正在使用拓扑中的Aggregate()函数对已经分组的字段进行分组。试试这个:

.aggregate(new Count(), new Fields("user-word-count"))

而不是:

.aggregate(new Fields("remote-client-ip", "query-string"), new Count(), new Fields("user-word-count"))