专业的编程技术博客社区

网站首页 > 博客文章 正文

ClickHouse的Bitmap在用户画像圈选的应用

baijin 2024-10-17 07:47:08 博客文章 9 ℃ 0 评论

一般我们在用户画像根据标签圈选用户时,采用Clickhouse的Bitmap的功能,但是要求UserId是整形,即integer或者bigint,如果遇见超几十亿用户基数且ID值很大就很麻烦。

要么做一次ID的映射mapping,要么等着计算引擎支持

例如Clickhouse的Int数据类型表示范围:

Int32的最大表示在21亿+,UInt32最大表示42亿+




在Clickhouse的老版本中bitmap计算例如2021.1的版本仅支持到UInt32,也就是最大的UserID的值为42亿+,超过则在Bitmap是溢出的,只能转换为分群集合为数组array在判断,如下:

—注意规避问题

select 

--仅仅支持UInt32(42亿+整型,int32 21亿+)

bitmapContains(groupBitmapMergeState(uv),toUInt32(9379715501)) as is_exists, 

has(bitmapToArray(groupBitmapMergeState(uv)),9379715501) as array_is_exists 

from user_tags_bitmap where tag='user_belong_m' and value='2004718' ;


—clickhouse最新版本2023.11.30,支持UInt64,表示范围就“贼大”20位数

SELECT

bitmapBuild([4079715501,9379715501, 9223372036854775807,17023372036854775807]) AS res,

toTypeName(res),

bitmapContains(res,toUInt64(9379715501)) as is_exists,

bitmapContains(res,toUInt64(17023372036854775807)) as is_exists_1, 

bitmapContains(res,toUInt64(17123372036854775807)) as is_exists_2,  

has(bitmapToArray(res),9223372036854775807) as array_is_exists


插曲:引入Presto的bigint的数据范围,是不是超出范围报错


#捕获异常try_cast

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表