单字段去重
先看一个简单的sql ,pv_id 去重计数
SELECT
visit_type,
count(DISTINCT pv_id) as pv_cnt
from exp_table
where ds=20220320
group by visit_type;
在默认情况下,相同的visit_type 的pv_id 会被分配到同一个reducer中处理,如果某个visit_type的数据量特别大,那么对应的reducer执行耗时会比较久或者可能会发生OOM,因此常规优化方式是:
select
visit_type,count(*)
from (
SELECT
visit_type,pv_id
from exp_table
where ds=20220320
group by visit_type,pv_id
) group by visit_type;
也就是将count distinct 转换为 group by 操作,第一层根据visit_type,pv_id分组,第二层根据visit_type 直接求和即可,使数据分布更加均匀。但是 这种方式在第二层group by 也可能会产生大量的数据shuffle操作,可以再次优化: