李成笔记网

专注域名、站长SEO知识分享与实战技巧

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

一般我们在用户画像根据标签圈选用户时,采用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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言