Clickhouse的bitmap函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Clickhouse的bitmap函数相关的知识,希望对你有一定的参考价值。

参考技术A 从无符号整型(UInt8、UInt32、UInt64等)array构造bitmap

将bitmap转成整型array

返回bitmap中,range_start到range_end区间内(不包含renge_end)的子集bitmap对象

返回bitmap中,从range_start开始的cardinality_limit个元素组成的子集bitmap对象

判断指定bitmap中是否存在e元素

bitmap1中是否包含bitmap2中的元素,只要有一个相同的元素,就返回1,否则返回0.

bitmap1中是否全部包含bitmap2中的元素,全部包含就返回1,否则返回0.

返回bitmap的基数

将bitmap中的元素进行转换,将存在于from_array的元素,一次转换成to_array的对应元素。

上面的例子中,依次将bitmap中,5转成2,999(不存在)转成888,2转成20。因为就bitmap中不存在999,所以新bitmap没有888;因为将5转成2,又将2转成20,所以新bitmap中去掉了5和2元素,新加了20元素

求两个bitmap的交集

求两个bitmap的并集

求两个bitmap的异或

求bitmap1与bitmap2的与非

clickhouse create table 异常:在查询中发现聚合函数 minState(origin_user) 位置错误

【中文标题】clickhouse create table 异常:在查询中发现聚合函数 minState(origin_user) 位置错误【英文标题】:clickhouse create table Exception: Aggregate function minState(origin_user) is found in wrong place in query 【发布时间】:2021-10-17 09:25:20 【问题描述】:
CREATE TABLE user_dwd.user_tag_bitmap_local 
(
    `tag` String,
    `tag_item` String,
    `p_day` Date,
    `origin_user` UInt64,
    `users` AggregateFunction(min, UInt64) MATERIALIZED minState(origin_user)
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMMDD(p_day)
ORDER BY (tag, tag_item)
SETTINGS index_granularity = 8192;

运行sql建表时,报错:

[2021-10-17 12:05:28] 代码:184,e.displayText() = DB::Exception:在查询中发现聚合函数 minState(origin_user) 位置错误:处理 minState 时(origin_user) AS users_tmp_alter9508717652815860223:默认表达式和列类型不兼容。 (版本 21.8.4.51(正式版))

如何解决错误?

【问题讨论】:

【参考方案1】:

minState 是一个聚合函数,你不能这样使用它(它用于带有 groupby 部分的查询)。 要解决它,您可以使用MATERIALIZED initializeAggregation...MATERIALIZED arrayReduce(minState...

但实际上您不需要第二列。 您正在寻找 SimpleAggregateFunction:

https://clickhouse.com/docs/en/sql-reference/data-types/simpleaggregatefunction/

CREATE TABLE user_dwd.user_tag_bitmap_local 
(
    `tag` String,
    `tag_item` String,
    `p_day` Date,
    `origin_user` SimpleAggregateFunction(min, UInt64) ---<<<-----
)
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMMDD(p_day)
ORDER BY (tag, tag_item)
SETTINGS index_granularity = 8192;

https://clickhouse.com/docs/en/sql-reference/functions/other-functions/#initializeaggregation

CREATE TABLE user_tag_bitmap_local
(
    `tag` String,
    `tag_item` String,
    `p_day` Date,
    `origin_user` UInt64,
    `users` AggregateFunction(min, UInt64) MATERIALIZED initializeAggregation('minState', origin_user)
)
ENGINE = AggregatingMergeTree
PARTITION BY toYYYYMMDD(p_day)
ORDER BY (tag, tag_item)
SETTINGS index_granularity = 8192

https://clickhouse.com/docs/en/sql-reference/functions/array-functions/#arrayreduce

CREATE TABLE user_tag_bitmap_local
(
    `tag` String,
    `tag_item` String,
    `p_day` Date,
    `origin_user` UInt64,
    `users` AggregateFunction(min, UInt64) MATERIALIZED arrayReduce('minState', [origin_user])
)
ENGINE = AggregatingMergeTree
PARTITION BY toYYYYMMDD(p_day)
ORDER BY (tag, tag_item)
SETTINGS index_granularity = 8192

【讨论】:

以上是关于Clickhouse的bitmap函数的主要内容,如果未能解决你的问题,请参考以下文章

《ClickHouse企业级应用:入门进阶与实战》8 基于ClickHouse Bitmap实现DMP用户画像标签圈人

clickhouse索引

用户画像Clickhouse位图函数实践总结

在clickhouse中,投射失败时如何返回null而不是抛出异常?

ClickHouse SQL 语法基础极简教程 + bitmap 位图数据类型的使用实例

Apache Doris 和 ClickHouse 的选型比较