1.GroupByHashAggregationBuilder
1.重要成員
private final GroupByHash groupByHash;//包括找出group組id,添加新的gooup等
private final List<Aggregator> aggregators;//用於存儲不同聚合類型的集合
private final OperatorContext operatorContext;
private final boolean partial;
2.重要方法
該方法把page中的數據按照不同的group進行分組,但是這時並沒有進行聚合,聚合操作是在getOutput方法中進行的
private void processPage(Page page)
{
if (aggregators.isEmpty()) {
groupByHash.addPage(page);
return;
}
GroupByIdBlock groupIds = groupByHash.getGroupIds(page);//通過多通道(multi-channel)hash方法獲取到一個組id:主要是通過hash值來進行判斷,多通道hash計算出的組id是新的,就新建一個組,用於存儲屬於該組的數據;如果通過hash值計算出的組id是已有的組,則返回該組id
for (Aggregator aggregator : aggregators) { //把數據歸類到不同的聚合器中,等待調用getOutput方法時進行聚合
aggregator.processPage(groupIds, page);
}
}