最近在项目中有部分的需求是关于需要在名单下存有百万千万级的客户数据,考虑可以使用位图的存储结构来存储名单下的客户id,正好项目中是用clickhouse存储的客户宽表数据,所以考虑用clickhouse一起来做这部分的处理了。以下内容不涉及业务逻辑,只是位图的简单使用
首先是数据库字段,因为考虑到存储效率以及位图类型是没有实现序列化接口的,所以实现位图需要两个字段,一个是位图的存储字段,一个是位图序列化后经过BASE64转码后的字段
这里随便列举一下,
位图字段BITMAP,字段类型是AggregateFuncition(groupBitmap,UInt64) MATERIALIZED base64Decode(BITMAP_STR), AggregateFuncition(groupBitmap,UInt64)就是位图在clickhouse中的实现,结合后面的物化视图,因直接存入位图的话空间占用是非常大的,一个位图基数在百万左右的位图大概就在2M多,因此结合物化视图使用,不实际占用空间,查询效率也是质的提升,物化视图的条件为当存入BITMAP_STR字段时,base解码该字符串转为uint64类型值,再对值做聚合得到位图存入BITMAP字段。
这里用到的位图类是Roaring64NavigableMap,这是一种高效压缩位图,详细不介绍了,插入位图流程如下:
再说一下位图获取,简单写一下这部分sql
groupBitmapState(toUInt64(ifnull(CUST_ID,0))) AS BITMAP,groupBitmap函数是从对所选无符号整数列进行位图或聚合计算,返回 UInt64 类型的基数,如果添加后缀 State ,则返回位图对象。这里是会将CUST_ID字段转化为位图结构然后查询得到。
clickhouse中提供了很多位图操作的函数,具体参考官网文档 clickhouse.com/docs/en/sql…
最后放一下groupbitmap和Roaring64NavigableMap相关的技术贴
zhuanlan.zhihu.com/p/445396980
clickhouse中bitmap应用技术贴