zl程序教程

您现在的位置是:首页 >  Java

当前栏目

GreenPlum Hash聚合简析

2023-02-18 16:43:15 时间

GreenPlum Hash聚合简析

Hash聚合相关结构体

首先需要了解Hash表是什么结构?该Hash表在哪个结构里进行管理?如何和聚合算子的结构联系起来?

从下图可以看到:

1)Hash表位于:AggState聚合算子状态描述结构的perhash中,即hashtable。

2)hash表的hash函数由perhash->hashfunctions进行描述,其实是个二维数组指针,包含每个hash列的hash函数描述。

3)Hash函数的OID来自Agg结构体的grpOperators数组。Hash探测中的比较函数的OID是eqfuncoids,通过:

BuildTupleHashTable->BuildTupleHashTableExt->ExecBuildGroupingEqual

将eqfuncoids转换 成计算步骤tab_eq_func。

4)Hash表的hash桶是TupleHashEntryData* data。Key值通过hash函数hash后与sizemask进行与操作,结果为数组下标。也就是定位到哪个hash桶。

5)Hash桶结构体中包含:MinimalTuple firstTuple,也就是每个分组的第一个值。而additional即AggStatePerGroupData结构的指针,保存每个分组的聚合计算中间值。

6)每次聚合计算时,从下层节点拿到一个tuple,然后通过hash映射到对应的hash桶。拿到对应的AggStatePerGroupData,将其赋给AggState中的hash_pergroup。将hash_pergroup带入聚合计算函数,将计算结果保存到hash_pergroup中。这样就完成了分组聚合。

实例解析

比如,一组数组:1 1 2 2 3 3进行count

1)拿到第一个1,经hash函数映射后得到data[1],该桶下的additional为开始为空,此时申请一个AggStatePerGroupData空间,并放到additional下。

2)将该AggStatePerGroupData地址给了AggState的hash_pergoup。

3)将hash_pergoup带入聚合计算函数中,transValue由Datum转换成数值后加1

4)接着拿到第二个1,同理,得到data[1],此时他的additional已经有AggStatePerGroupData,将其付给hash_pergoup带入聚合计算函数中进行计算。计算后transValue为2。也就是1的个数是2

5)同理,计算2和3这个两个分组。分别得到3个分组:1的个数是2,2的个数是2,3的个数是2。