On this page
按汇总分组
Terminology
(否)Map Aggr:配置变量 hive.map.aggr 设置为 true 或 false 的简写,表示分别允许或不允许进行 mapside 聚合。
(否)偏斜:配置变量 hive.groupby.skewindata 设置为 true 或 false 的简写,表示某些列的不同值的数量不成比例。
Design
在按操作员将汇总选项添加到组之前,基于(否)Map Aggr 和(否)Skew 的 4 种可能组合,有 4 种不同的计划。这些基于以下内容,并扩展为 6 个计划:
MapAggr 和无偏斜:
该计划保持不变,只是修改了基于 Map 端基于哈希的聚合运算符的实现,以处理汇总所需的额外行。该计划如下:
Mapper:
*基于哈希的运算符分组,以执行部分聚合
*减少接收器运算符,执行一些部分聚合
Reducer:
- MergePartial(基于列表)按操作员分组以执行最终聚合
MapAggr 和 Skew
同样,该计划保持不变,只是修改了基于 Map 端基于哈希的聚合运算符的实现,以处理汇总所需的额外行。该计划如下:
Mapper 1:
*基于哈希的运算符分组,以执行部分聚合
*减少接收器操作员按组按和使用不同的键(如果有不同的键)或其他随机数
Reducer 1:
*操作员按部分(基于列表)分组以执行进一步的部分聚合
Mapper 2:
*减少接收器运算符,执行一些部分聚合
Reducer 2:
*最终(基于列表)按操作员分组以执行最终汇总
请注意,如果没有按组键或唯一键,则从计划中删除了 Reducer 1 和 Mapper 2,并且 Mapper 1 中的 Reduce Sink 运算符不会喷洒
没有 MapAggr,没有倾斜和没有汇总
该计划是从组的前汇总版本得出的,其中没有 Map Aggr,也没有偏斜,出于完整性考虑,我将其包括在内,因为如果不使用汇总,它仍然是一个选项。该计划如下:
Mapper:
*减少接收器运算符,执行一些部分聚合
Reducer:
*按操作员完成(基于列表的)分组以执行所有聚合
无 MapAggr,无偏斜和汇总
该计划如下:
Mapper 1:
*减少接收器运算符,不执行任何部分聚合
Reducer 1:
*基于哈希的运算符分组,非常类似于先前案例的 Map 器中使用的分组
Mapper 2:
*减少接收器运算符,执行一些部分聚合
Reducer 2:
- MergePartial(基于列表)按操作员分组以执行剩余的聚合
无 MapAggr 和偏斜&(无明显差异或无汇总)
该计划与 group by 的汇总前版本中的 No Map Aggr 和 Skew 的情况相同,对于不使用汇总或没有任何聚合使用唯一键的 cad 来说,该计划也是如此。如果使用汇总,则对基于列表的分组操作符的实现进行了修改,以处理汇总所需的额外行。该计划如下:
Mapper 1:
*减少接收器操作员按组按和使用不同的键(如果有不同的键)或其他随机数
Reducer 1:
- Partial1(基于列表的)按操作员分组以执行部分聚合,它在必要时利用新的基于列表的按操作员分组进行汇总
Mapper 2:
*减少接收器运算符,执行一些部分聚合
Reducer 2:
*最终(基于列表)操作员分组以执行剩余的汇总
没有 MapAggr,偏斜,不同和汇总
如果没有 Map Aggr 和 Skew,并且有涉及不同键的聚合,并且正在使用汇总,则使用此计划。该计划如下:
Mapper 1:
*减少接收器操作员按组按和使用不同的键(如果有不同的键)或其他随机数
Reducer 1:
*基于哈希的运算符分组,非常类似于先前案例的 Map 器中使用的分组
Mapper 2:
*减少接收器操作员按组按和使用不同的键(如果有不同的键)或其他随机数
Reducer 2:
*操作员按部分(基于列表)分组以执行进一步的部分聚合
Mapper 3:
*减少接收器运算符,执行一些部分聚合
Reducer 3:
*最终(基于列表)按操作员分组以执行最终汇总
请注意,如果没有按组键或唯一键,则从计划中删除了 Reducer 2 和 Mapper 3,并且 Mapper 2 中的 reducesink 操作器不会喷洒。此外,请注意,进行 Mapper 2 喷涂的原因是,如果数据中的时滞存在于汇总没有立即归零的列中(例如,如果按组分组的键依次是 g1,g2,g3 列,与列 g1 或 g2 中存在偏斜的情况有关)在散列聚合之后偏斜可能 continue 存在,因此我们进行了喷涂。