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