ClickHouse位图bitmap函数在数据分析及开发中应用十分广泛,Bitmap函数相对略微复杂。Bitmap是大数据里面常见的数据结构,简单来说就是按位存储,为了解决在去重场景里面大数据量存储问题
SELECTbitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),cast([5,999,2]asArray(UInt32)),cast([2,888,20]asArray(UInt32)))ASres--上面的例子中,依次将bitmap中,5转成2,999(不存在)转成888,2转成20。因为就bitmap中不存在999,所以新bitmap没有888;因为...
SELECTbitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))ASres image.png bitmapHasAll(bitmap,bitmap) bitmap1中是否全部包含bitmap2中的元素,全部包含就返回1,否则返回0. SELECTbitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,2]))ASres image.png bitmapCardinality(bitmap) 返回...
SELECT bitmapOr(bitmap1, bitmap2) AS user_union FROM table; Bitmap的“非”操作(差集):bitmapAnd(bitmap1, bitmapNot(bitmap2))。 这个函数表示计算两个bitmap的差集,具体来说,就是返回在bitmap1中存在,但在bitmap2中不存在的元素。 SELECT bitmapAnd(bitmap1, bitmapNot(bitmap2)) AS user_d...
(groupBitmap, UInt32) comment 'bitmap存储' ) engine ReplacingMergeTree() order by tag_name primary key tag_name; select tag_name, bitmapToArray(ids) as ids from tag_audience; insert into tag_audience values ('a1', bitmapBuild(cast(array(1, 2, 3, 4, 5) as Array(UInt32))); sel...
这样,源数据和加工后的bitmap都可以存储在CK中,当然,数据由数仓推送到CK中还需要数据管道提供支持。 3)解决bitmap加工问题 源数据和准备好之后,则是如何将源表的数据加工成标签的bitmap,这方面CK拥有非常多的bitmap函数支持,可以参考:https://clickhouse.com/docs/en/sql-reference/functions/bitmap-functions ...
2.Bitmap 圈客实现 我们可以看出,使用了画像宽表圈人的逻辑其实就是从明细数据中找到满足条件的用户并最终构建人群,也就是我们筛了多少标签就在对应的表后就对应的条件,如果海量标签的话,这个也会存在一定效率低下,这里我们可以引进bitmap的实现方式来优化,使用BitMap进行圈人的话,会对用户进行预聚合,在人群圈选...
3)解决bitmap加工问题 源数据和准备好之后,则是如何将源表的数据加工成标签的bitmap,这方面CK拥有非常多的bitmap函数支持,可以参考:https://clickhouse.com/docs/en/sql-reference/functions/bitmap-functions 在上文的列式存储表数据中,多了一行id对应的offset,这些offset可以在数据推送过程中写入。假设表名为tag...
ClickHouse实现了大量的BitMap的函数,用来操作BitMap。ClickHouse中的BitMap在32位的时候用的是Set实现的,大于32位的时候也是使用RoaringBitMap实现的。我们这里不看具体的函数,我们来看一个典型的使用场景。 最常见的一个场景是根据标签来进行用户的圈选。常见的解决办法是有一张用户标签表,比如 ...