精确去重和Roaring BitMap

精确去重和Roaring BitMap

互联网行业常见的一个业务需求就是求UV(日活)和N日留存,这就涉及到去重计数(COUNT DISTINCT)的计算.

BitMap概述

精确去重算法主要通过BitMap来实现,它本质上是定义了一个很大的 bit 数组,每个元素对应到 bit 数组的其中一位

一个Integer是32-bit, 一共有Integer.MAX_VALUE = 2 ^ 32个值,对于原始的Bitmap来说,这就需要2 ^ 32长度的bit数组
通过计算可以发现(2 ^ 32 / 8 bytes = 512MB), 一个普通的Bitmap需要耗费512MB的存储空间
不管业务值的基数有多大,这个存储空间的消耗都是恒定不变的,这显然是不能接受的
而Roaring Bitmap作为压缩性能更好的位图索引,广泛应用于众多成熟的开源大数据平台(Kylin、Druid、ES等)

对于非Integer类型的数据(比如String类型),可以通过数据字典映射成Integer

Roaring Bitmap的数据结构

  • Roaring bitmap用来表示所有32-bit的unsigned integer的集合(共2 ^ 32 = 42 9496 7296个)
  • 这个数足够覆盖一款产品的用户量了

Roaring bitmap的数据结构为Key-Value的键值对:

  • Key: 根据业务值整数的high 16-bits进行分桶(共2 ^ 16 = 65536个), 每一个Roaring Bitmap的Key值(first-level)都存放在short(16-bit)类型的有序数组中: short[] keys
  • Value: 用于存放业务值整数的low 16-bits的一个container. 每一个Roaring Bitmap有一个Container数组: Container[] values

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值