You need to enable JavaScript to run this app.
导航

BitEngine

最近更新时间2024.03.19 17:11:54

首次发布时间2023.11.23 20:15:43

BitEngine 是一个高效 集合数据 处理模型,它是查询分析数据库ClickHouse的一部分。BitEngine 底层基于 MergeTree Family 存储引擎,并在此基础上引入了 BitMap64 类型,开发了系列相关运算函数。BitEngine 提供的 BitMap64类型适合表达具有特定关系的大量实体ID的集合,将集合的交并补运算转化为bitmap之间的交并补运算,从而达到远超普通查询的性能指标。已上线业务的测试表明,使用 BitEngine 相比普通和 Array 或者用户表方式,在查询速度上有 10-50 倍不等的提升。
同时,我们也可以通过 字典编码 提升用户输入bitmap的计算性能。字典编码是一种数据压缩手段,它是BitEngine的一个部分,用于将用户输入的ID按照数字顺序从低到高依次编码,解决了Bitmap 存储的元素过于稀疏,无法最大化体现自身优势的问题。
不使用字典编码,仍然可以使用 BitEngine 的函数和聚合函数。

注意

BitEngine 不支持 HaUniqueMergeTree 引擎,只支持默认的 HaMergeTree 或 MergeTree 引擎类型。

基本用法

下面以单机测试为例,介绍建表和数据导入的基本用法。

建表

BitEngine 提供了BitMap64数据类型,在建表时,我们将需要将人群包存储的数据类型设置为BitMap64,例如:

CREATE TABLE [db.]table_name (
p_date Date, 
slice_id UInt64, 
tag String, 
ids BitMap64
) ENGINE = MergeTree PARTITION BY p_date ORDER BY tag_id 
SETTINGS index_granularity = 128

BitEngine 字典编码过程由引擎自动完成,用户可以通过对 BitMap64类型添加 BitEngineEncode属来性开启字典编码。例如:

CREATE TABLE [db.]table_name (
tag String,
slice_id UInt64, 
p_date Date,
ids BitMap64 BitEngineEncode
)ENGINE = HaMergeTree('/clickhouse/xxxx/{shard}', '{replica}')
PARTITION BY p_date
ORDER BY tag
SETTINGS index_granularity = 128

如果是在 ByteHouse 控制台建表,需要点击自定义,然后手动输入 BitMap64BitMap64 BitEngineEncode类型。
图片

数据导入

BitEngine 主要的数据存储方式是 BitMap64,用户在进行数据导入的时候,可以直接使用类似 Array(UInt64) 类型的数据导入方式进行导入,例如:

INSERT INTO TABLE [db.]table_name values ('2020-01-01', 1, 'male', [1,2,3,4,5])

BitEngine 会自动将 Array 类型的数据存储为 BitMap64 类型,之后存储和计算的类型都是 BitMap64 类型。
文件导入方式支持使用 CSV、JSON 等格式,与Array类型支持的导入方式相同。

查询

BitEngine 支持 ClickHouse 所有的查询方式,可以使用 ClickHouse 原有的函数操作BitMap64类型,但是他们的效率可能不高,为此我们开发了一系列的函数用于高效操作BitMap64类型,详见BitEngine 函数
例如,我们可以通过 bitmapColumnHas(bitmap_column, integer) 函数,接收一列 BitMap64 类型的数据,并检查该列是否包含指定元素:

select bitmapColumnHas(ids, 1) from [db.]table_name

函数和操作接口

详情请参考: BitEngine 函数