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 控制台建表,需要点击自定义,然后手动输入 BitMap64
或 BitMap64 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 函数