前言
优化策略
推荐使用group by代替distinct去重
参考:
重要结论: 两者都会在map阶段count,但reduce阶段,distinct只有一个, group by 可以有多个进行并行聚合,所以group by会快。
distinct
只生成一个reducer任务,所有的id都聚集到同一个reducer任务进行去重然后在聚合,非常容易造成数据倾斜。distinct耗费内存,可能产生OOM,但效率高。
group by
将数据分组到了多个reducer上进行处理,所以较快。groupby排序消耗时间更多,在时间复杂度允许下,空间复杂度更低。
例子:
在一个具有5,563,985,064个记录的hive表中,对其中的两个字段进行查询,耗时如下:
-- 耗时00:11:17
select col1,col2
from 库名xxx.表名xxx
where ds=20230224
group by col1,col2;
-- 耗时00:25:07
select distinct col1,col2
from 库名xxx.表名xxx where ds=20230224;
【其他优化策略待更新】