Можно ли объединить два разных IMap в Hazelcast?

У меня есть две карты hazelcast 1. map2 2. map2

Хотел соединить обе карты по ключу.

Могу ли я сделать это в hazelcast?

Спасибо


person anirudhas    schedule 24.08.2017    source источник


Ответы (2)


Обновленный ответ для 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. пример кода, в котором реализован пользовательский обработчик объединения (термины "совместная группа" и "объединение" тесно связаны). Вы сможете предоставить два источника карт, и в выходном потоке вы получите пару коллекций для каждого отдельного ключа, содержащих все элементы с одним и тем же ключом из каждого из источников. Вы также можете адаптировать его для производства пар предметов.

Первоклассная поддержка присоединения к потоку — это функция, запланированная для предстоящего выпуска Jet.

person Marko Topolnik    schedule 25.08.2017

Присоединяясь, что вы имеете в виду или какую операцию вы хотите выполнить, присоединившись? Вы можете иметь 2 разные карты с одним и тем же ключом и настроить как PartitionAware, чтобы оба ключа были в одном разделе/участнике (т. е. операции можно выполнять без затрат на дополнительные сетевые вызовы и дополнительные проводные данные). http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#data-affinity

person Hiten    schedule 24.08.2017
comment
Я хотел выполнить некоторую агрегацию, например, count(*) на двух картах, имеющих один и тот же ключ, например MAC-адрес, на двух разных картах. - person anirudhas; 25.08.2017