本文将为您介绍在Hologres中RoaringBitmap函数的具体参数和使用。
背景信息
RoaringBitmap是一种高效的Bitmap压缩算法,目前已被广泛应用在各种语言和各种大数据平台。适合计算超高基维的,常用于去重、标签筛选、时间序列等计算中。
RoaringBitmap算法是将32位的INT类型数据划分为216个数据块(Chunk),每一个数据块对应整数的高16位,并使用一个容器(Container)来存放一个数值的低16位。RoaringBitmap将这些容器保存在一个动态数组中,作为一级索引。容器使用两种不同的结构:数组容器(Array Container)和位图容器(Bitmap Container)。数组容器存放稀疏的数据,位图容器存放稠密的数据。如果一个容器里面的整数数量小于4096,就用数组容器来存储值。若大于4096,就用位图容器来存储值。
采用这种存储结构,RoaringBitmap可以快速检索一个特定的值。在做位图计算(AND、OR、XOR)时,RoaringBitmap提供了相应的算法来高效地实现在两种容器之间的运算。使得RoaringBitmap无论在存储和计算性能上都表现优秀。
使用限制
在Hologres中使用RoaringBitmap函数,具体限制如下:
- 仅Hologres V0.10及以上版本的独享实例支持该函数。 说明- 请在Hologres管控台查看当前实例版本,如果您的实例是V0.10以下版本,请您使用常见升级准备失败报错或加入Hologres钉钉交流群反馈,详情请参见如何获取更多的在线支持?。 
- 该函数默认加载到public Schema下,且只能加载到public Schema下,不能加载到其他Schema。 
- 自Hologres V3.1版本起,支持存储64位的RoaringBitmap数据类型(RoaringBitmap64)。其中,部分RoaringBtimap函数支持处理RoaringBitmap64类型的数据,且在处理RoaringBitmap64类型的数据时,不支持常量入参。 
- RoaringBitmap函数在使用之前,需要执行以下语句开启EXTENSION才可以调用。EXTENSION是DB级别的函数,一个DB只需执行一次即可,新建DB需要重新执行。 - --创建extension CREATE EXTENSION roaringbitmap;- 如需卸载RoaringBitmap扩展,请执行如下命令。 - DROP EXTENSION roaringbitmap;重要- 不推荐使用 - DROP EXTENSION <extension_name> CASCADE;命令级联卸载Extension。CASCADE(级联)删除命令不仅会删除指定扩展本身,还会一并清除扩展数据(例如PostGIS数据、RoaringBitmap数据、Proxima数据、Binlog数据、BSI数据等)以及依赖该扩展的对象(包括元数据、表、视图、Server数据等)。
- 不支持将RoaringBitmap设置为Bitmap或者Dictionary。 
- 在创建含RoaringBitmap列的表时,需要显式指定RoaringBitmap列的数据类型RoaringBitmap(32位)或RoaringBitmap64(64位),且两种RoaringBitmap类型的数据不支持混合计算。 - -- 创建含32位Roaring Bitmap列的表 CREATE TABLE t_rb_32 ( bucket int, x roaringbitmap ); -- 创建含64位Roaring Bitmap列的表 CREATE TABLE t_rb_64 ( bucket int, x roaringbitmap64 ); -- 不支持两种Roaring Bitmap类型混合计算,直接报错 -- ERROR: operator does not exist: roaringbitmap & roaringbitmap64 SELECT a.x & b.x FROM t_rb_32 a JOIN t_rb_64 b ON a.bucket = b.bucket;
操作符列表
以下操作符支持处理RoaringBitmap和RoaringBitmap64类型的数据。
| 操作符 | 输入类型 | 输出类型 | 描述 | 示例 | 备注 | 
| & | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | 与入参类型一致。 | And计算。 | rb_build('{1,2,3}') & rb_build('{3,4,5}') | 不涉及 | 
| | | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | 与入参类型一致。 | Or计算。 | rb_build('{1,2,3}') | rb_build('{3,4,5}') | 不涉及 | 
| RoaringBitmap | RoaringBitmap64, INTEGER | RoaringBitmap | RoaringBitmap64 | rb_build('{1,2,3}') | 6 | Hologres V1.3.16及以上版本支持。 | ||
| INTEGER, RoaringBitmap | RoaringBitmap64 | RoaringBitmap | RoaringBitmap64 | 6 | rb_build('{1,2,3}') | Hologres V1.3.16及以上版本支持。 | ||
| # | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | 与入参类型一致。 | Xor计算。 | rb_build('{1,2,3}') # rb_build('{3,4,5}') | 不涉及 | 
| << | RoaringBitmap | RoaringBitmap64, BIGINT | RoaringBitmap | RoaringBitmap64 | Shift left计算。 | rb_build('{1,2,3}') << 2 | Hologres V1.3.16及以上版本支持。 | 
| >> | RoaringBitmap | RoaringBitmap64, BIGINT | RoaringBitmap | RoaringBitmap64 | Shift right计算。 | rb_build('{1,2,3}') >> 3 | Hologres V1.3.16及以上版本支持。 | 
| - | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | 与入参类型一致。 | AndNot计算。 | rb_build('{1,2,3}') - rb_build('{3,4,5}') | Hologres V1.3.16及以上版本支持。 | 
| RoaringBitmap | RoaringBitmap64, INTEGER | RoaringBitmap | RoaringBitmap64 | rb_build('{1,2,3}') - 3 | 不涉及 | ||
| @> | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 判断是否为包含关系。 | rb_build('{1,2,3}') @> rb_build('{3,4,5}') | 不涉及 | 
| RoaringBitmap | RoaringBitmap64, INTEGER | BOOLEAN | rb_build('{1,2,3}') @> 3 | 不涉及 | ||
| <@ | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 判断是否为被包含关系。 | rb_build('{1,2,3}') <@ rb_build('{3,4,5}') | 不涉及 | 
| integer, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 3 <@ rb_build('{1,2,3}') | 不涉及 | ||
| && | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 判断是否有重叠。 | rb_build('{1,2,3}') && rb_build('{3,4,5}') | 不涉及 | 
| = | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 判断是否相等。 | rb_build('{1,2,3}') = rb_build('{3,4,5}') | 不涉及 | 
| <> | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 判断是否不等。 | rb_build('{1,2,3}') <> rb_build('{3,4,5}') | 不涉及 | 
Bitmap函数列表
- 支持处理RoaringBitmap和RoaringBitmap64类型的函数 - 函数名 - 输入类型 - 输出类型 - 描述 - 示例 - rb_build_agg - INTEGER|BIGINT - 入参的数据类型为: - INTEGER时,返回RoaringBitmap类型。 
- BIGINT时,返回RoaringBitmap64类型。 
 - 将Offset聚合成RoaringBitmap。 说明- 仅Hologres V3.1及以上版本支持BIGINT入参类型,并返回RoaringBitmap64类型。 - rb_build_agg(1)- rb_cardinality - RoaringBitmap | RoaringBitmap64 - INTEGER - 统计基数。 - rb_cardinality(rb_build('{1,2,3,4,5}'))- rb_and_cardinality - RoaringBitmap | RoaringBitmap64,RoaringBitmap | RoaringBitmap64 - INTEGER - And计算并返回基数。 - rb_and_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))- rb_or_cardinality - RoaringBitmap | RoaringBitmap64,RoaringBitmap | RoaringBitmap64 - INTEGER - Or计算并返回基数。 - rb_or_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))- rb_range - RoaringBitmap | RoaringBitmap64,BIGINT,BIGINT - RoaringBitmap | RoaringBitmap64 - 返回从起始位置(包含)到结束位置(不包含)范围的新集合,位置从1开始计数。 说明- Hologres V1.3.16及以上版本支持。 - rb_range(rb_build('{1,2,3}'), 2, 3)- rb_minimum - RoaringBitmap | RoaringBitmap64 - INTEGER - 返回Bitmap中最小的Offset,如果Bitmap为空则返回-1。 - rb_minimum(rb_build('{1,2,3}'))- rb_maximum - RoaringBitmap | RoaringBitmap64 - INTEGER - 返回Bitmap中最大的Offset,如果Bitmap为空则返回0。 - rb_maximum(rb_build('{1,2,3}'))- rb_to_array - RoaringBitmap | RoaringBitmap64 - INTEGER[] - 返回Bitmap对应整型数组。 - rb_to_array(rb_build('{1,2,3}'))- rb_to_array_string - RoaringBitmap | RoaringBitmap64, TEXT - TEXT - 返回Bitmap对应整型数组拼接的字符串。 - rb_to_array_string(rb_build('{1,2,3}'),',')
- 仅支持处理RoaringBitmap64类型的函数 - 函数名 - 输入类型 - 输出类型 - 描述 - 示例 - rb64_build - BIGINT[] - RoaringBitmap64 - 通过数组创建一个64位的RoaringBitmap。 说明- Hologres V3.1及以上版本支持。 - --准备数据 CREATE TABLE public.tn ( id INT, num BIGINT[] ); INSERT INTO public.tn ("id", "num") VALUES (01, '{1,2}'); SELECT rb64_build (num) rb_num,num FROM public.tn;- 返回结果如下。 - rb_num num \x030100000000000000000000003a30000001000000000001001000000001000200 {1,2}
- 仅支持处理RoaringBitmap类型的函数 - 函数名 - 输入类型 - 输出类型 - 描述 - 示例 - rb_build - INTEGER[] - RoaringBitmap - 通过数组创建一个32位RoaringBitmap。 - --返回结果:\x3a3000000100000000000000100000000100 SELECT rb_build_agg(1);- roaringbitmap_in - TEXT - RoaringBitmap - 将TEXT类型转换成RoaringBitmap类型。 说明- Hologres V2.1.33及以上版本支持。 - --新建示例表。 CREATE TABLE rb_text ( id int, a text ); --插入示例数据。 INSERT INTO rb_text VALUES (1, '\x3a300000010000000000090010000000010002000300040005000600070008000900c800'); --将字段a转换成roaringbitmap类型,并进行and聚合运算。 SELECT rb_and_cardinality_agg (roaringbitmap_in (a::cstring)) FROM rb_text; --返回结果 rb_and_cardinality_agg| ----------------------- 10|- rb_index - RoaringBitmap, INTEGER - BIGINT - 返回此roaringbitmap中元素从0开始的索引,如果不存在则返回-1。 说明- Hologres V1.3.16及以上版本支持。 - rb_index(rb_build('{1,2,3}'),3)- rb_and_null2empty - RoaringBitmap,RoaringBitmap - RoaringBitmap - And计算。当输入参数为Null时,按empty处理。 说明- Hologres V1.1.42及以上版本支持。 - rb_and_null2empty(rb_build(null),rb_build('{3,4,5}'))- rb_or_null2empty - RoaringBitmap,RoaringBitmap - RoaringBitmap - Or计算。当输入为Null时,按empty处理。 说明- Hologres V1.1.42及以上版本支持。 - rb_or_null2empty(rb_build(null),rb_build('{3,4,5}'))- rb_andnot_null2empty - RoaringBitmap,RoaringBitmap - RoaringBitmap - AndNot计算。当输入为Null时,按empty处理。 说明- Hologres V1.1.42及以上版本支持。 - rb_andnot_null2empty(rb_build(null),rb_build('{3,4,5}'))- rb_and_null2empty_cardinality - RoaringBitmap,RoaringBitmap - INTEGER - And计算并返回基数。当输入为Null时,按empty处理。 说明- Hologres V1.1.42及以上版本支持。 - rb_and_null2empty_cardinality(rb_build(null),rb_build('{3,4,5}'))- rb_or_null2empty_cardinality - RoaringBitmap,RoaringBitmap - INTEGER - Or计算并返回基数。当输入为Null时,按empty处理。 说明- Hologres V1.1.42及以上版本支持。 - rb_or_null2empty_cardinality(rb_build(null),rb_build('{3,4,5}'))- rb_xor_cardinality - RoaringBitmap,RoaringBitmap - INTEGER - Xor计算并返回基数。 - rb_xor_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))- rb_andnot_cardinality - RoaringBitmap,RoaringBitmap - INTEGER - AndNot计算并返回基数。 - rb_andnot_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))- rb_andnot_null2empty_cardinality - RoaringBitmap,RoaringBitmap - INTEGER - AndNot计算并返回基数。当输入为Null时,按empty处理。 说明- Hologres V1.1.42及以上版本支持。 - rb_andnot_null2empty_cardinality(rb_build(null),rb_build('{3,4,5}'))- rb_is_empty - RoaringBitmap - BOOLEAN - 判断是否为空的Bitmap。 - rb_is_empty(rb_build('{1,2,3,4,5}'))- rb_fill - RoaringBitmap,BIGINT,BIGINT - RoaringBitmap - 填写指定范围(不包括range_end)。 说明- Hologres V1.3.16及以上版本支持。 - rb_fill(rb_build('{1,2,3}'), 5, 7)- rb_clear - RoaringBitmap,BIGINT,BIGINT - RoaringBitmap - 清除指定范围(不包括 range_end)。 说明- Hologres V1.3.16及以上版本支持。 - rb_clear(rb_build('{1,2,3}'), 2, 3)- rb_contains_bitmap - RoaringBitmap,RoaringBitmap - BOOLEAN - 判断第一个Bitmap是否包含第二个Bitmap。 - rb_contains(rb_build('{1,2,3}'),rb_build('{3}'))- rb_flip - RoaringBitmap,INTEGER,INTEGER - RoaringBitmap - 翻转Bitmap中特定的Offset段。 - rb_flip(rb_build('{1,2,3}'),2,3)- rb_range_cardinality - RoaringBitmap, BIGINT, BIGINT - BIGINT - 返回从起始位置(包含)到结束位置(不包含)范围的基数,位置从1开始计数。 说明- Hologres V1.3.16及以上版本支持。 - rb_range_cardinality(rb_build('{1,2,3}'), 2, 3)- rb_rank - RoaringBitmap,INTEGER - INTEGER - 返回Bitmap中小于等于指定Offset的基数。 - rb_rank(rb_build('{1,2,3}'),3)- rb_jaccard_dist - RoaringBitmap,RoaringBitmap - DOUBLE PRECISION - 返回两个Bitmap的Jaccard距离(或Jaccard相似系数)。 说明- Hologres V1.3.16及以上版本支持。 - rb_jaccard_dist(rb_build('{1,2,3}'), rb_build('{3,4}'))- rb_select - RoaringBitmap, bitset_limit bigint, bitset_offset bigint=0, reverse boolean=false, range_start bigint=-2147483648, range_end bigint=2147483647 - RoaringBitmap - 返回范围 [range_start,range_end) 之间Bitmap的子集 [bitset_offset,bitset_offset+bitset_limit)。 - rb_select(rb_build('{1,2,3,4,5,6,7,8,9}'), 5, 2) - rb_iterate - RoaringBitmap - Set of Integer - 返回Offset List。 - rb_iterate(rb_build('{1,2,3}'))
Bitmap聚合函数列表
- 支持处理RoaringBitmap和RoaringBitmap64类型的函数 - 函数名 - 输入类型 - 输出类型 - 描述 - 示例 - rb_or_agg - RoaringBitmap | RoaringBitmap64 - 与入参类型一致。 - Or聚合计算。 - rb_or_agg(rb_build('{1,2,3}'))- rb_and_agg - RoaringBitmap | RoaringBitmap64 - 与入参类型一致。 - And聚合计算。 - rb_and_agg(rb_build('{1,2,3}'))- rb_or_cardinality_agg - RoaringBitmap | RoaringBitmap64 - INTEGER - Or聚合计算并返回其基数。 - rb_or_cardinality_agg(rb_build('{1,2,3}'))- rb_and_cardinality_agg - RoaringBitmap | RoaringBitmap64 - INTEGER - And聚合计算并返回其基数。 - rb_and_cardinality_agg(rb_build('{1,2,3}'))
- 仅支持处理RoaringBitmap类型的函数 - 函数名 - 输入类型 - 输出类型 - 描述 - 示例 - rb_xor_agg - RoaringBitmap - RoaringBitmap - Xor聚合计算。 - rb_xor_agg(rb_build('{1,2,3}'))- rb_xor_cardinality_agg - RoaringBitmap - INTEGER - Xor聚合计算并返回其基数。 - rb_xor_cardinality_agg(rb_build('{1,2,3}'))
其他Bitmap函数
以下函数仅支持处理RoaringBitmap类型的数据。
| 函数名 | 输入类型 | 输出类型 | 描述 | 示例 | 
| roaringbitmap_text | TEXT, BOOLEAN | RoaringBitmap | 将TEXT类型的二进制RoaringBitmap数据反序列转换成RoaringBitmap结构。第二个参数表示是否进行格式校验,建议选择true,否则会返回错误的Bitmap数据。 | 
 | 
| rb_to_text | RoaringBitmap | TEXT | 将RoaringBitmap结构转为TEXT类型的二进制RoaringBitmap数据输出。 | 
 | 
使用示例
如下内容将为您介绍RoaringBitmap函数完整的使用示例。
- 加载RoaringBitmap函数插件。 - CREATE EXTENSION roaringbitmap;
- 创建带有RoaringBitmap数据类型的表。 - --创建名称为t1的表 CREATE TABLE public.t1 (id integer, bitmap roaringbitmap);
- 使用rb_build函数插入RoaringBitmap的数据。 - --数组位置对应的BIT值为1 INSERT INTO public.t1 SELECT 1,RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); --将输入的多条记录的值对应位置的BIT值设置为1,最后聚合为一个RoaringBitmap INSERT INTO public.t1 SELECT 2,RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
- 进行Bitmap计算(OR、AND、XOR、ANDNOT)。 - SELECT RB_OR(a.bitmap,b.bitmap) FROM ( SELECT bitmap FROM public.t1 WHERE id = 1 ) AS a ,( SELECT bitmap FROM public.t1 WHERE id = 2 ) AS b ;
- 进行Bitmap聚合计算(OR、AND、XOR、BUILD),并生成新的RoaringBitmap类型。 - SELECT RB_OR_AGG(bitmap) FROM public.t1; SELECT RB_AND_AGG(bitmap) FROM public.t1; SELECT RB_XOR_AGG(bitmap) FROM public.t1; SELECT RB_BUILD_AGG(id) FROM public.t1;
- 统计基数(Cardinality),即统计RoaringBitmap中包含多少个位置为1的BIT位。 - SELECT RB_CARDINALITY(bitmap) FROM public.t1;
- 从RoaringBitmap中返回位置为1的BIT下标(即位置值)。 - SELECT RB_ITERATE(bitmap) FROM public.t1 WHERE id = 1;
- 将RoaringBitmap转换为数组结构。 - SELECT RB_TO_ARRAY(bitmap) FROM public.t1 WHERE id = 1;