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