Я пытаюсь использовать функцию уменьшения карты Hazelcast для выполнения агрегированной операции, которая требует доступа к совместно размещенным записям. Совместное размещение контролируется с помощью привязки данных.
Представьте себе классическую модель customer / order, используемую в Документация Hazelcast о сродстве данных. В моем примере я хочу вернуть сводку по клиентам, в которой есть клиент и сумма всех их заказов, например, с учетом этого набора данных:
customer_id | name
------------------
1 | Dave
2 | Kate
order_id | customer_id | value
------------------------------
1 | 1 | 5
2 | 1 | 10
3 | 2 | 12
Я хочу вернуться:
customer_id | name | value
--------------------------
1 | Dave | 15
2 | Kate | 12
Это достаточно просто, однако причина использования сродства данных заключается в том, чтобы иметь возможность выполнять логику суммирования в соответствующем разделе, содержащем данные, просто получая все заказы в этом разделе и, следовательно, избегая любой перекрестной связи JVM.
Итак, мой вопрос из Mapper или аналогичного , как получить совместно размещенные записи в другом кэше?
РЕДАКТИРОВАТЬ:
После ответа и комментариев @noctarius вот некоторый код (я постарался сделать его как можно короче), который выделяет точку, в которой мне нужны только заказы из текущего раздела.
Класс ключа порядка выглядит так:
public class OrderKey implements PartitionAware<CustomerIdentity>
{
...
@Override
public CustomerIdentity getPartitionKey()
{
return this.customerIdentity;
}
...
}
И Mapper
вот так:
public class OrderSumMapper implements Mapper<CustomerKey, Customer, CustomerKey, CustomerOrderTotal>, HazelcastInstanceAware
{
...
@Override
public void map(CustomerKey customerKey, Customer customer, Context<CustomerKey, CustomerOrderTotal> context)
{
Predicate ordersForCustomer = new OrdersForCustomerPredicate(customerKey);
int totalValue = 0;
//******************************************************************
//
// Given orders are co-located with the customer, how do you ensure
// this call to get the orders only runs in the current partition?
//
//******************************************************************
for (Order order : hazelcastInstance.getMap("orders").values(ordersForCustomer))
{
totalValue += order.getValue();
}
context.emit(customerKey, new CustomerOrderTotal(customer, total));
}
...
}
Выделенный вызов hazelcastInstance.getMap("orders").values(ordersForCustomer)
обычно попадает во все узлы в кластере, но поскольку данные размещены в одном месте, это лишние накладные расходы.
Итак, вернемся к исходному вопросу: как я получаю такие заказы, что возвращаются только те, которые находятся в текущем разделе?