跳转至

聚合

1.简介

聚合函数对一组值执行计算,并返回单个值。

聚合首先要对表进行分组,分组的常用方式有排序和哈希。

2.排序

排序首先对表进行排序,然后对表进行顺序扫描,并计算结果。

这种做法的问题在于排序本身的成本是较大的,如果我们不需要基于排序的表才能得出计算结果,那么进行多路排序和维护一个中间结果都是较大的消耗。

3.哈希

更具体的名字为External Hashing Aggregate,思想是通过哈希函数对问题进行规模拆分,然后在规模更小的子集中对问题进行处理。

在聚合过程中会维护一个中间哈希表。由于哈希表没有顺序性,因此在维护该哈希表的过程中会产生许多随机I/O。步骤设计的目的的是最大化每个page可以做的工作量,以便于减少磁盘交互,尽可能在内存中进行工作。

拥有两个步骤:

  • Partition:维护多个bucket,通过哈希函数决定tuple被存放到哪个bucket中,每个拥有相同key的tuple都会被存到同一个bucket中。这一步的目的是拆分数据规模。
  • ReHash:对于每个bucket,读取他们的数据并以此建立哈希表,然后对表中同一个key的tuple进行计算。由于第一部中已经进行了规模拆分,因此哈希表与磁盘的交互就更少。