使用Theta Sketch统计广告曝光量及独立用户数的方案咨询
方案建议
一、Theta Sketch k值选择与存储测算
- k值推荐选**16384(即2^14)**即可,最高不超过32768,不需要设置到1e5。对应的相对误差为1/√16384≈0.78%,完全满足广告场景的误差容忍要求,1e5的k值只会无意义增加存储和计算开销,误差下降的收益很低。
- 存储测算:单条k=16384的压缩Theta Sketch体积约为30KB,假设你有500个维度,所有维度的基数总和为100万,每天单份数据的存储量约为100万 * 30KB = 30GB,加上多副本冗余也完全在低成本可控范围内。
二、Q2(独立用户数统计)方案优化
你当前采用的「高表+单维度值Theta Sketch」模型是非常适合你的场景的选择,完美规避了数百个维度带来的预聚合组合爆炸问题,集合运算灵活度高,存储成本低。如果想要进一步降低基础设施成本,也可以替换Druid为ClickHouse:ClickHouse原生内置了Theta Sketch的所有操作函数,集群搭建和运维成本比Druid低30%以上,同样可以满足5分钟以内的查询响应要求。
三、Q1(广告曝光次数统计)实现方案
3.1 方案选择
Q1不需要采用和Q2完全一致的近似方案,可根据业务对精度的要求二选一:
- 高精度方案:将常用的多维度组合做预聚合Rollup,直接新增
曝光次数整数字段,预聚合时做sum累加,查询时直接命中预聚合结果可做到秒级返回,误差为0。该方案适合维度组合查询模式比较固定的场景,不会产生过高的存储开销。 - 灵活近似方案:如果你的Q1查询维度组合非常灵活,没有固定模式,完全可以沿用Q2的高表模型,将Impression-ID生成Theta Sketch存储即可。
3.2 关于Impression-ID Sketch的准确率问题
你的担心是多余的:Theta Sketch的相对误差仅和k值相关,和统计对象的总基数无关。哪怕你每天有2500亿次曝光,只要k值选16384,相对误差依然稳定在0.78%左右,不会出现准确率比Q2差很多的情况。
四、额外优化建议
- 可以冷热数据分层存储:超过30天的历史数据降低k值到8192,进一步压缩存储成本,旧数据的误差容忍度通常更高。
- 如果有大量多维度交集查询,可以提前预聚合部分高频维度组合的Sketch,大幅降低查询时的集合运算开销,把响应时间压缩到秒级。
内容的提问来源于stack exchange,提问作者Kartik Mahajan
相关产品推荐
相关产品推荐

