ClickHouse 集成Bitmap(2022-01-16更新)

本文详细探讨了ClickHouse中利用Bitmap高效进行1亿条数据的精确去重计数,并介绍了位图存储、位运算及其在去重、统计分析中的应用。通过groupBitmap和uniqExact函数展示了高性能去重方法。
摘要由CSDN通过智能技术生成

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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会点东西的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值