引言
在用户画像系统中,我们经常用到BitMap这个数据结构。
假设,系统一共有10个用户
- 90后的用户有2位,用户ID是0、1
- 80后的用户有8位,用户ID分别是2、3、4、5、6、7、8、9
对于传统的关系型数据的存储如下
用户ID | 标签类型 | 标签值 |
---|---|---|
0 | 年龄区间 | 90后 |
1 | 年龄区间 | 90后 |
2 | 年龄区间 | 80后 |
… | ||
9 | 年龄区间 | 80后 |
0 | 购买力 | 高 |
… | … | … |
如果基于BitMap,我们可以这样存
- “人群包”,代表具有这个标签值的用户集合。“人群包”用一个二进制存,每一位代表一个用户
- 比如“80后”这个标签,所对应的人群是
1111111100
。1表示有这个标签,0表示没有这个标签- 第1位(从右往左数)是0,即代表,ID=0的用户没有“80后”这个标签
- 第2位也是0,即代表,ID=1的用户没有“80后”这个标签
- 第3-10位都是1,即代表,ID=2-9的用户有“80后”这个标签
- 比如“90后”这个标签,所对应的人群是
0000000011
。1表示有这个标签,0表示没有这个标签- 因此,
0000000011
即代表0、1用户有“90后”这个标签,而2-9用户没有“90后”这个标签 | 标签类型 | 标签值 | 人群包(BitMap) | | —- | —- | —- | | 年龄区间 | 80后 |1111111100
| | 年龄区间 | 90后 |0000000011
|
- 因此,
优点:
- 实则为倒排表的方式,节省空间。最用UInt64,它表示范围从0到18446744073709551615的无符号整数,用来表示系统所有用户已足够
BitMap
BitMap,顾名思义是一个Bit的映射表。它实际上就是一个二进制值,我们为每一个bit位赋予一个物理意义,那么一个bit就对应了一个意义,此为“Map”的含义。
优点:
- 节省存储空间,