2017-08-22 9 views
0

Thisサンプルコードによりグループの集約を実装する方法、それは一連の属性に基づいて集計を取得することが可能です与えられた会社Hazelcastアグリゲータは:

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

のために給与の合計を取得するに例を示しますか? 会社でフィルタを適用する代わりに、会社単位でグループ化することはできますか?アグリゲータでない場合、SQL述語はこれをサポートしていますか?


EDIT: 私は、カスタム集計

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; 
     } 

    } 

を書くことができたが、私は複数のフィールドで複数の集計(複数の属性の合計)とグループを必要とするとき、それは複雑になりますありません。これは今後のバージョンでサポートされる予定ですか?

+0

これは後継APIであるため、高速集計の例をご覧ください:) – noctarius

+0

ありがとうございました。私は高速集約をチェックしました。しかし、それでもmap.aggregateのサポートはフィールドのマップ(グループ化されている)と集計された結果(給与の合計)の結果である結果を返すことです –

+0

要件はもっと似ています、データオブジェクトの膨大な量がありますキャッシュ。ユーザーの要件に応じて、データを特定のレベルにグループ化し、データをユーザーに送り返します。例:会計分野では、さまざまなレベル(粒度レベルまたは最上位レベル)で計算された損益があります。これは、ユーザーがクリックすると、基本的なフィルタ(先月の会計情報のみを表示するようなデータ)を表示したいと思うレベルに似ています。レコードは、前述のレベルで集計されたオブジェクトの特定のプロパティとともに返されます –

答えて

0

グループ別のバージョンでサポートされます。今のところカスタム実装に固執する必要があります。プロパティでグループ化された複数の属性の合計を累積するのは難しいことではありません。値の地図などを持ってください