Hazelcast Jet-按用例分组

时间:2019-06-30 11:30:00

标签: hazelcast-jet

我们需要在巨大的数据集上以动态方式将多个字段分组。数据存储在Hazelcast Jet群集中。示例:如果Person类包含4个字段:agenamecitycountry。我们首先需要按城市分组,然后按国家分组,然后我们可以根据条件参数按名称分组。

我们已经尝试使用分布式集合,但无法正常工作。即使我们尝试使用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

1 个答案:

答案 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()的聚合始终是全局的。也就是说,输入中的所有项目都将汇总到一个输出项目中。