Hazelcast聚合器:如何为group by实现聚合器

时间:2017-08-22 14:36:47

标签: hazelcast

This示例代码给出了获取给定公司薪水总和的示例

int avgSalary = employees.aggregate(
                Supplier.fromPredicate(
                        (entry) -> "Hazelcast".equals(mapEntry.getValue().getCompanyName(),
                                Supplier.all((value) -> value.getSalaryPerMonth())
                        ), Aggregations.integerAvg());

是否可以根据属性集获取聚合? 即,我可以按公司分组,而不是在公司上应用过滤器吗?如果不是聚合器,SQL谓词是否支持这个?

编辑: 我能够编写自定义聚合器

class DayLocalSumGroupByBookAggregator extends Aggregator<Map.Entry<Long, Pnl>, Map<Integer, Double>> {

        private static final long serialVersionUID = 1L;

        Map<Integer, Double> bookToSumOfDayLocal ;

        @Override
        public void accumulate(Entry<Long, Pnl> input) {
            Integer bookId = input.getValue().getBookId();
            if(bookToSumOfDayLocal == null ){
                bookToSumOfDayLocal = new HashMap<>();
            }
            Double sum = bookToSumOfDayLocal.get(bookId);
            if(sum == null){
                sum = 0d;
            }
            sum += input.getValue().getDayLocal();
            bookToSumOfDayLocal.put(bookId, sum);
        }

        @Override
        public void combine(Aggregator aggregator) {
            //TODO
        }

        @Override
        public Map<Integer, Double> aggregate() {
            return bookToSumOfDayLocal;
        }

    }

但是当我需要多个聚合(多个属性的总和)和多个字段分组时,它确实变得复杂。这将在更多版本中得到支持吗?

1 个答案:

答案 0 :(得分:0)

将在更多版本中支持Group by。现在你需要坚持自定义实现。积累由属性分组的多个属性的总和并不难。只需要一张价值图等等。