我们需要在巨大的数据集上以动态方式将多个字段分组。数据存储在Hazelcast Jet群集中。示例:如果Person
类包含4个字段:age
,name
,city
和country
。我们首先需要按城市分组,然后按国家分组,然后我们可以根据条件参数按名称分组。
我们已经尝试使用分布式集合,但无法正常工作。即使我们尝试使用Pipeline API,也会引发错误。
代码:
IMap res= client.getMap("res"); // res is distrbuted map
Pipeline p = Pipeline.create();
JobConfig jobConfig = new JobConfig();
p.drawFrom(Sources.<Person>list("inputList"))
.aggregate(AggregateOperations.groupingBy(Person::getCountry))
.drainTo(Sinks.map(res));
jobConfig = new JobConfig();
jobConfig.addClass(Person.class);
jobConfig.addClass(HzJetListClientPersonMultipleGroupBy.class);
Job job = client.newJob(p, jobConfig);
job.join();
然后我们从客户端的地图中读取并销毁它。
服务器上的错误消息:
原因:java.lang.ClassCastException:java.util.HashMap无法转换为java.util.Map $ Entry
答案 0 :(得分:2)
groupingBy
将所有输入项聚合到HashMap
中,其中使用给定功能提取键。在您的情况下,它将Person
个项目的流聚合为一个HashMap<String, List<Person>>
个项目。
您需要使用此:
p.drawFrom(Sources.<Person>list("inputList"))
.groupingKey(Person::getCountry)
.aggregate(AggregateOperations.toList())
.drainTo(Sinks.map(res));
这将在res
地图上填充每个城市的人员列表。
请记住,没有groupingKey()
的聚合始终是全局的。也就是说,输入中的所有项目都将汇总到一个输出项目中。