是否有可能在Hazelcast中加入两个不同的IMaps?

时间:2017-08-24 22:05:49

标签: hazelcast hazelcast-imap hazelcast-jet

我有两张淡褐色地图 map2 2. map2

我想加入密钥上的两张地图。

我可以在淡褐色播放中做到吗?

谢谢

2 个答案:

答案 0 :(得分:4)

更新了Jet 0.7的答案:

如果要在“主键”(地图中使用的实际键)上加入两个IMap,则应使用hashJoin管道转换。让我们从这些源阶段开始:

BatchStage<Entry<String, Person>> person = p.drawFrom(Sources.map("person"));
BatchStage<Entry<String, Employee>> employee = p.drawFrom(Sources.map("employee"));

这是加入他们的基本方式:

BatchStage<Tuple2<Person, Employee>> joined =
    persons.hashJoin(employees, joinMapEntries(Entry::getKey),
        (personEntry, employee) -> tuple2(personEntry.getValue(), employee));

您将获得成对的加入项(Tuple2<Person, Employee>)。另一种常见情况是将一个项目附加到另一个项目,例如Employee可能具有person属性:

class Employee { 
    Person person; 

    Employee setPerson(Person person) { 
        this.person = person;
        return this;
    } 
}

有了这个,你可以写

BatchStage<Employee> joined =
    persons.hashJoin(employees, joinMapEntries(Entry::getKey),
        (personEntry, employee) -> employee.setPerson(personEntry.getValue()));

Jet 0.4的旧答案:

您可以使用Hazelcast Jet以流式方式连接两张地图。查看实现自定义加入处理器的cogroup-operator代码示例(术语“co-group”和“join”密切相关)。您将能够提供两个地图源,并且在输出流中,您将获得每个不同键的一对集合,从每个源中保存具有相同键的所有项。您可以调整它以生成成对的项目。

流媒体加入的一流支持是即将发布的Jet的计划功能。

答案 1 :(得分:0)

加入你的意思或加入你想做的操作?您可以使用具有相同密钥的2个不同映射并配置为PartitionAware,以便两个密钥都位于相同的分区/成员上(即,可以执行操作而无需额外的网络调用和额外的线数据)。 http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#data-affinity