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中,投射失败时如何返回null而不是抛出异常?