本文將為您介紹在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以下版本,請您使用自助升級或加入HologresDingTalk交流群反饋,詳情請參見如何擷取更多的線上支援?。
該函數僅獨享執行個體支援,共用叢集不支援。
該函數預設載入到public Schema下,且只能載入到public Schema下,不能載入到其他Schema。
Hologres V1.3版本新增了若干RoaringBitmap函數(見函數列表描述備忘),若您需要使用這些函數,請您使用自助升級或加入HologresDingTalk交流群反饋,詳情請參見如何擷取更多的線上支援?。
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 | And計算。 | rb_build('{1,2,3}') & rb_build('{3,4,5}') | 不涉及 |
| | roaringbitmap, roaringbitmap | roaringbitmap | Or計算。 | rb_build('{1,2,3}') | rb_build('{3,4,5}') | 不涉及 |
roaringbitmap, integer | roaringbitmap | rb_build('{1,2,3}') | 6 | Hologres V1.3.16及以上版本支援。 | ||
integer, roaringbitmap | roaringbitmap | 6 | rb_build('{1,2,3}') | Hologres V1.3.16及以上版本支援。 | ||
# | roaringbitmap, roaringbitmap | roaringbitmap | Xor計算。 | rb_build('{1,2,3}') # rb_build('{3,4,5}') | 不涉及 |
<< | roaringbitmap, bigint | roaringbitmap | Shift left計算。 | rb_build('{1,2,3}') << 2 | Hologres V1.3.16及以上版本支援。 |
>> | roaringbitmap, bigint | roaringbitmap | Shift right計算。 | rb_build('{1,2,3}') >> 3 | Hologres V1.3.16及以上版本支援。 |
- | roaringbitmap, roaringbitmap | roaringbitmap | AndNot計算。 | rb_build('{1,2,3}') - rb_build('{3,4,5}') | Hologres V1.3.16及以上版本支援。 |
roaringbitmap, integer | roaringbitmap | rb_build('{1,2,3}') - 3 | 不涉及 | ||
@> | roaringbitmap, roaringbitmap | bool | 判斷是否為內含項目關聯性。 | rb_build('{1,2,3}') @> rb_build('{3,4,5}') | 不涉及 |
roaringbitmap, integer | bool | rb_build('{1,2,3}') @> 3 | 不涉及 | ||
<@ | roaringbitmap, roaringbitmap | bool | 判斷是否為被內含項目關聯性。 | rb_build('{1,2,3}') <@ rb_build('{3,4,5}') | 不涉及 |
integer, roaringbitmap | bool | 3 <@ rb_build('{1,2,3}') | 不涉及 | ||
&& | roaringbitmap, roaringbitmap | bool | 判斷是否有重疊。 | rb_build('{1,2,3}') && rb_build('{3,4,5}') | 不涉及 |
= | roaringbitmap, roaringbitmap | bool | 判斷是否相等。 | rb_build('{1,2,3}') = rb_build('{3,4,5}') | 不涉及 |
<> | roaringbitmap, roaringbitmap | bool | 判斷是否不等。 | rb_build('{1,2,3}') <> rb_build('{3,4,5}') | 不涉及 |
Bitmap函數列表
Bitmap函數主要包括的函數及說明如所示:
函數名 | 輸入 | 輸出 | 描述 | 樣本 |
roaringbitmap_in | text | roaringbitmap | 將text類型轉換成roaringbitmap類型。 說明 Hologres V2.1.33及以上版本支援。 |
|
rb_build | integer[] | roaringbitmap | 通過數組建立一個Bitmap。 說明 Hologres V1.3.39版本前只支援常量數組作為輸入,V1.3.39版本開始支援ARRAY列作為輸入。 |
|
rb_index | roaringbitmap, integer | bigint | 返回此roaringbitmap中元素從0開始的索引,如果不存在則返回-1。 說明 Hologres V1.3.16及以上版本支援。 |
|
rb_and_null2empty | roaringbitmap,roaringbitmap | roaringbitmap | And計算。當輸入參數為Null時,按empty處理。 說明 Hologres V1.1.42及以上版本支援。 |
|
rb_or_null2empty | roaringbitmap,roaringbitmap | roaringbitmap | Or計算。當輸入為Null時,按empty處理。 說明 Hologres V1.1.42及以上版本支援。 |
|
rb_andnot_null2empty | roaringbitmap,roaringbitmap | roaringbitmap | AndNot計算。當輸入為Null時,按empty處理。 說明 Hologres V1.1.42及以上版本支援。 |
|
rb_cardinality | roaringbitmap | integer | 統計基數。 |
|
rb_and_cardinality | roaringbitmap,roaringbitmap | integer | And計算並返回基數。 |
|
rb_and_null2empty_cardinality | roaringbitmap,roaringbitmap | integer | And計算並返回基數。當輸入為Null時,按empty處理。 說明 Hologres V1.1.42及以上版本支援。 |
|
rb_or_cardinality | roaringbitmap,roaringbitmap | integer | Or計算並返回基數。 |
|
rb_or_null2empty_cardinality | roaringbitmap,roaringbitmap | integer | Or計算並返回基數。當輸入為Null時,按empty處理。 說明 Hologres V1.1.42及以上版本支援。 |
|
rb_xor_cardinality | roaringbitmap,roaringbitmap | integer | Xor計算並返回基數。 |
|
rb_andnot_cardinality | roaringbitmap,roaringbitmap | integer | AndNot計算並返回基數。 |
|
rb_andnot_null2empty_cardinality | roaringbitmap,roaringbitmap | integer | AndNot計算並返回基數。當輸入為Null時,按empty處理。 說明 Hologres V1.1.42及以上版本支援。 |
|
rb_is_empty | roaringbitmap | boolean | 判斷是否為空白的Bitmap。 |
|
rb_fill | roaringbitmap,bigint,bigint | roaringbitmap | 填寫指定範圍(不包括range_end)。 說明 Hologres V1.3.16及以上版本支援。 |
|
rb_clear | roaringbitmap,bigint,bigint | roaringbitmap | 清除指定範圍(不包括 range_end)。 說明 Hologres V1.3.16及以上版本支援。 |
|
rb_contains | roaringbitmap, roaringbitmap | boolean | 判斷第一個Bitmap是否包含第二個Bitmap |
|
rb_flip | roaringbitmap,integer,integer | roaringbitmap | 翻轉Bitmap中特定的Offset段。 |
|
rb_range | roaringbitmap,bigint,bigint | roaringbitmap | 返回從起始位置(包含)到結束位置(不包含)範圍的新集合,位置從1開始計數。 說明 Hologres V1.3.16及以上版本支援。 |
|
rb_range_cardinality | roaringbitmap, bigint, bigint | bigint | 返回從起始位置(包含)到結束位置(不包含)範圍的基數,位置從1開始計數。 說明 Hologres V1.3.16及以上版本支援。 |
|
rb_minimum | roaringbitmap | integer | 返回Bitmap中最小的Offset,如果Bitmap為空白則返回-1。 |
|
rb_maximum | roaringbitmap | integer | 返回Bitmap中最大的Offset,如果Bitmap為空白則返回0。 |
|
rb_rank | roaringbitmap,integer | integer | 返回Bitmap中小於等於指定Offset的基數。 |
|
rb_jaccard_dist | roaringbitmap,roaringbitmap | double precision | 返回兩個Bitmap的Jaccard距離(或Jaccard相似係數)。 說明 Hologres V1.3.16及以上版本支援。 |
|
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) 說明 Hologres V1.3.16及以上版本支援。 |
|
rb_iterate | roaringbitmap | set of integer | 返回Offset List。 |
|
rb_to_array | roaringbitmap | integer[] | 返回Bitmap對應整型數組。 |
|
rb_to_array_string | roaringbitmap, text | text | 返回Bitmap對應整型數組拼接的字串。 |
|
Bitmap彙總函式列表
Bitmap彙總函式主要包括的函數及說明如所示:
函數名 | 輸入資料類型 | 輸出資料類型 | 描述 | 樣本 |
rb_build_agg | integer | roaringbitmap | 將Offset彙總成bitmap。 |
|
rb_or_agg | roaringbitmap | roaringbitmap | Or彙總計算。 |
|
rb_and_agg | roaringbitmap | roaringbitmap | And彙總計算。 |
|
rb_xor_agg | roaringbitmap | roaringbitmap | Xor彙總計算。 |
|
rb_or_cardinality_agg | roaringbitmap | integer | Or彙總計算並返回其基數。 |
|
rb_and_cardinality_agg | roaringbitmap | integer | And彙總計算並返回其基數。 |
|
rb_xor_cardinality_agg | roaringbitmap | integer | Xor彙總計算並返回其基數。 |
|
其他Bitmap函數
函數名 | 輸入資料類型 | 輸出資料類型 | 描述 | 樣本 |
roaringbitmap_text | text, bool | 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;