除去这两种主流方法,其实还是要从思想上去解决单节点数据量过大的问题,软方法就是先分桶。
核心是两阶段聚合
分桶的方法有很多,比如去重场景下,可以先按照字符串的长度先将数据分桶,再在每个桶里计算 distinct,然后再 sum 一下结果就可以得到全局的 UV 。
亿万级海量数据去重软方法,spark/hive/flink/mr通用 | 航行学园
先求出 uid 的长度create table event_tmp as select *,length(uid) as len_uid from event;首先先对 uid 和 day两个字段进行 groupby (减轻单点压力)再对中间结果求 sum即可。select sum(uv_tmp) as uv from ( select day_num,size(collect_set(uid)) as uv_tmp from event_tmp group by len_uid,day_num ) tmp group by day_num(类似的还有求13亿人的收入前一万,可以先按照身份证号前6位分桶,再聚合一次)两阶段聚合思想
海量数据高效去重的思想就是最大的把计算和数据并行化,充分利用、均衡利用分布式集群下的算力,避开单点压力,强去重的方法在小数据量下会有优势,