ClickHouse 继承Bitmap
1、精确去重计数性能测试
1.1、创建一张test表
create table test(
user_id UInt32,
test_Date DateTime,
part UInt8
)ENGINE = MergeTree
PARTITION BY part
ORDER BY part
SETTINGS index_granularity = 8192
1.2、往test表插入1亿条数据
insert into test SELECT *,1 as part FROM generateRandom('userid UInt32, test_Date Date') LIMIT 100000000
1.3、进行精确去重计数性能测试
1亿条数据,去重计算出9千多万整形数值。
- 非精确去重函数:uniq、uniqHLL12、uniqCombined
- 精确去重函数:uniqExact、groupBitmap
函数 | 时长(秒) | 去重后个数 | 误差个数 | 误差率 |
---|---|---|---|---|
uniq(user_id) | 0.324 | 98517062 | 326237 | 0.33% |
uniqHLL12(user_id) | 0.967 | 99480495 | -637196 | -0.64% |
uniqCombined(user_id) | 0.957 | 98600278 | 243021 | 0.25% |
uniqExact(user_id) | 8.259 | 98843299 | 0 | 0% |
groupBitmap(user_id) | 16.740 | 98843299 | 0 | 0% |
注意:
①uniq、uniqHLL12、uniqCombined等函数是非精确去重函数,只适合于快速查询一些大概的统计结果。精确的去重统计不能用这些去重函数。
②groupBitmap仅支持整形值去重, uniqExact支持任意类型去重。
2、Bitmap位存储和位计算
bitmap位图运算为啥这个快。举个例子:我们知道,每个bit位表示一个数字id,假设有1亿个的用户id,那么只需要1亿bit位,约119m大小 = (1 * 10^9 / 8 / 1024 / 1024)。所以说,这是一种非常高效的计算方法,在计算目标用户的基数时有着得天独厚的优势。
通过单个bitmap可以完成精确去重操作,通过多个bitmap的and、or、xor、andnot等位操作可以完成经典的留存分析、漏斗分析、用户画像分析等场景的计算。
3、位图函数
位图对象有两种构造方法。一个是由聚合函数groupBitmapState构造的,另一个是由Array Object构造的。同时还可以将位图对象转化为数组对象。
我们使用RoaringBitmap实际存储位图对象,当基数小于或等于32时,它使用Set保存。当基数大于32时,它使用Roaring