离线数仓开发过程中经常会对数据去重后聚合统计,count distinct使得map端无法预聚合,容易引发reduce端长尾,以下是count distinct去重调优的几种方式。
解决方案一:group by 替代
原sql 如下:
#=====7日、14日的app点击的用户数(user_id去重统计)
select
group_id,
app_id,
-- 7日内UV
count(distinct case when dt >= '${7d_before}' then user_id else null end) as 7d_uv,
--14日内UV
count(distinct case when dt >= '${14d_before}' then user_id else null end) as 14d_uv
from tbl
where dt >= '${14d_before}'
group by group_id, --渠道
app_id; --app
优化思路:group by两阶段聚合
#=====7日、14日的app点击的用户