このトピックでは、Roaring ビットマップ関数の入力パラメーターと Hologres での使用方法について説明します。
背景情報
Roaring ビットマップは、複数のビッグデータプラットフォームのさまざまなプログラミング言語で使用される、効率的に圧縮されたビットマップです。超高カーディナリティディメンションに最適であり、重複排除、タグベースのフィルタリング、および時系列データの収集に使用できます。
Roaring ビットマップアルゴリズムは、32 ビット整数を 2 の 16 乗個のブロック(チャンク)に分割します。各ブロックは、整数の上位 16 ビットに対応します。コンテナーには、値の下位 16 ビットが格納されます。Roaring ビットマップは、コンテナーをプライマリインデックスとして動的配列に格納します。コンテナーには、スパースチャンク用の配列コンテナーとデンスチャンク用のビットマップコンテナーの 2 種類があります。配列コンテナーには最大 4,096 個の整数を格納できます。ビットマップコンテナーには 4,096 個を超える整数を格納できます。16
Roaring ビットマップはこのストレージ構造を使用して、特定の値を迅速に取得します。また、2 種類のコンテナー間で AND、OR、XOR などのビット単位の演算も提供します。その結果、Roaring ビットマップは優れたストレージパフォーマンスとコンピューティングパフォーマンスを実現します。
制限事項
Hologres で Roaring ビットマップ関数を使用する場合は、次の制限事項に注意してください。
これらの関数は、Hologres V0.10 以降の専用インスタンスでのみサポートされています。
説明インスタンスのバージョンは、Hologres コンソールで確認できます。インスタンスが V0.10 より前の場合、[アップグレードの準備が失敗した場合に返される一般的なエラーメッセージ] を使用するか、Hologres DingTalk グループに参加してフィードバックを提供できます。詳細については、「オンラインサポートを受けるにはどうすればよいですか。」をご参照ください。
これらの関数はデフォルトで public スキーマにロードされ、public スキーマにのみロードできます。
Hologres V3.1 以後では、64 ビット Roaring ビットマップ (RoaringBitmap64) がサポートされています。一部の Roaring ビットマップ関数は、RoaringBitmap64 型のデータを処理できます。 RoaringBitmap64 型のデータを処理する場合、これらの関数は定数入力パラメーターをサポートしていません。
Roaring ビットマップ関数を使用する前に、次の文を実行して拡張機能を有効にする必要があります。この拡張機能はデータベースレベルの関数です。データベースごとに 1 回だけ文を実行する必要があります。新しいデータベースを作成する場合は、文を再度実行する必要があります。
--拡張機能を作成する CREATE EXTENSION roaringbitmap;Roaring ビットマップ関数の拡張機能を削除する場合は、次の文を実行します。
DROP EXTENSION roaringbitmap;重要DROP EXTENSION <extension_name> CASCADE;文を使用して拡張機能を削除することはお勧めしません。 CASCADE 文は、指定された拡張機能だけでなく、拡張機能のデータと拡張機能に依存するオブジェクトも削除します。拡張データには、PostGIS データ、Roaring ビットマップデータ、Proxima データ、バイナリログデータ、BSI データが含まれます。オブジェクトには、メタデータ、テーブル、ビュー、サーバーデータが含まれます。Roaring ビットマップを格納するフィールドをビットマップインデックスまたはディクショナリインデックスとして指定することはできません。
Roaring ビットマップ列を含むテーブルを作成する場合は、列のデータ型を RoaringBitmap(32 ビット)または RoaringBitmap64(64 ビット)として明示的に指定する必要があります。 2 つのタイプの Roaring ビットマップデータを混在させて計算することはできません。
-- 32 ビット Roaring ビットマップ列を含むテーブルを作成する CREATE TABLE t_rb_32 ( bucket int, x roaringbitmap ); -- 64 ビット Roaring ビットマップ列を含むテーブルを作成する CREATE TABLE t_rb_64 ( bucket int, x roaringbitmap64 ); -- 2 つのタイプの Roaring ビットマップデータの混在計算はサポートされておらず、エラーが返されます。 -- エラー: 演算子が存在しません: 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 | 値を指定された桁数だけ左にシフトします。 | rb_build('{1,2,3}') << 2 | Hologres V1.3.16 以降でのみ、この演算子がサポートされています。 |
>> | RoaringBitmap | RoaringBitmap64, BIGINT | RoaringBitmap | RoaringBitmap64 | 値を指定された桁数だけ右にシフトします。 | 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 | A に B が含まれているかどうかを確認します。 | 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 | A が B に含まれているかどうかを確認します。 | 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 | A が B と交差するかどうかを確認します。 | rb_build('{1,2,3}') && rb_build('{3,4,5}') | なし |
= | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 2 つのオブジェクトが等しいかどうかを確認します。 | rb_build('{1,2,3}') = rb_build('{3,4,5}') | なし |
<> | RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64 | BOOLEAN | 2 つのオブジェクトが等しくないかどうかを確認します。 | rb_build('{1,2,3}') <> rb_build('{3,4,5}') | なし |
Roaring ビットマップ計算関数
RoaringBitmap 型と RoaringBitmap64 型のデータの処理をサポートする関数
関数
入力型
出力型
説明
例
rb_build_agg
INTEGER|BIGINT
入力パラメーターのデータ型は次のとおりです。
INTEGER: RoaringBitmap 型を返します。
BIGINT: RoaringBitmap64 型を返します。
オフセットを Roaring ビットマップに集約します。
説明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
2 つの Roaring ビットマップに対して AND 演算を実行して、カーディナリティを計算します。
rb_and_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))rb_or_cardinality
RoaringBitmap | RoaringBitmap64, RoaringBitmap | RoaringBitmap64
INTEGER
2 つの RoaringBitmap に対して 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
Roaring ビットマップの最小オフセットを返します。 Roaring ビットマップが空の場合、-1 が返されます。
rb_minimum(rb_build('{1,2,3}'))rb_maximum
RoaringBitmap | RoaringBitmap64
INTEGER
Roaring ビットマップの最大オフセットを返します。 Roaring ビットマップが空の場合、0 が返されます。
rb_maximum(rb_build('{1,2,3}'))rb_to_array
RoaringBitmap | RoaringBitmap64
INTEGER[]
Roaring ビットマップの作成元の整数配列を返します。
rb_to_array(rb_build('{1,2,3}'))rb_to_array_string
RoaringBitmap | RoaringBitmap64、TEXT
TEXT
Roaring ビットマップの作成元の整数配列と入力テキストを連結して生成された文字列を返します。
rb_to_array_string(rb_build('{1,2,3}'),',')RoaringBitmap64 型のデータのみの処理をサポートする関数
関数
入力タイプ
出力タイプ
説明
例
rb64_build
BIGINT[]
RoaringBitmap64
配列から 64 ビットの RoaringBitmap を作成します。
説明Hologres V3.1 以降でこの関数がサポートされています。
--Prepare data -- データの準備 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 の場合、関数はパラメーター値を空と見なします。
説明Hologres V1.1.42 以降でのみ、この関数がサポートされています。
rb_and_null2empty(rb_build(null),rb_build('{3,4,5}'))rb_or_null2empty
RoaringBitmap, RoaringBitmap
RoaringBitmap
OR 演算を実行します。入力パラメーターの値が NULL の場合、関数はパラメーター値を空と見なします。
説明Hologres V1.1.42 以降でのみ、この関数がサポートされています。
rb_or_null2empty(rb_build(null),rb_build('{3,4,5}'))rb_andnot_null2empty
RoaringBitmap, RoaringBitmap
RoaringBitmap
ANDNOT 演算を実行します。入力パラメーターの値が NULL の場合、関数はパラメーター値を空と見なします。
説明Hologres V1.1.42 以降でのみ、この関数がサポートされています。
rb_andnot_null2empty(rb_build(null),rb_build('{3,4,5}'))rb_and_null2empty_cardinality
RoaringBitmap, RoaringBitmap
INTEGER
2 つの RoaringBitmap に対して AND 演算を実行することにより、濃度 (cardinality) を計算します。入力パラメーターの値が NULL の場合、関数はパラメーター値を空と見なします。
説明Hologres V1.1.42 以降でのみ、この関数がサポートされています。
rb_and_null2empty_cardinality(rb_build(null),rb_build('{3,4,5}'))rb_or_null2empty_cardinality
RoaringBitmap, RoaringBitmap
INTEGER
2 つの RoaringBitmap に対して OR 演算を実行することにより、濃度 (cardinality) を計算します。入力パラメーターの値が NULL の場合、関数はパラメーター値を空と見なします。
説明Hologres V1.1.42 以降でのみ、この関数がサポートされています。
rb_or_null2empty_cardinality(rb_build(null),rb_build('{3,4,5}'))rb_xor_cardinality
RoaringBitmap, RoaringBitmap
INTEGER
2 つの RoaringBitmap に対して XOR 演算を実行することにより、濃度 (cardinality) を計算します。
rb_xor_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))rb_andnot_cardinality
RoaringBitmap, RoaringBitmap
INTEGER
2 つの RoaringBitmap に対して ANDNOT 演算を実行することにより、濃度 (cardinality) を計算します。
rb_andnot_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))rb_andnot_null2empty_cardinality
RoaringBitmap, RoaringBitmap
INTEGER
2 つの RoaringBitmap に対して ANDNOT 演算を実行することにより、濃度 (cardinality) を計算します。入力パラメーターの値が NULL の場合、関数はパラメーター値を空と見なします。
説明Hologres V1.1.42 以降でのみ、この関数がサポートされています。
rb_andnot_null2empty_cardinality(rb_build(null),rb_build('{3,4,5}'))rb_is_empty
RoaringBitmap
BOOLEAN
RoaringBitmap が空かどうかを確認します。
rb_is_empty(rb_build('{1,2,3,4,5}'))rb_fill
RoaringBitmap, BIGINT, BIGINT
RoaringBitmap
RoaringBitmap の指定された範囲 (範囲の終端を除く) を入力します。
説明Hologres V1.3.16 以降でのみ、この関数がサポートされています。
rb_fill(rb_build('{1,2,3}'), 5, 7)rb_clear
RoaringBitmap, BIGINT, BIGINT
RoaringBitmap
RoaringBitmap の指定された範囲 (範囲の終端を除く) をクリアします。
説明Hologres V1.3.16 以降でのみ、この関数がサポートされています。
rb_clear(rb_build('{1,2,3}'), 2, 3)rb_contains_bitmap
RoaringBitmap, RoaringBitmap
BOOLEAN
最初のビットマップに 2 番目のビットマップが含まれているかどうかを確認します。
rb_contains(rb_build('{1,2,3}'),rb_build('{3}'))rb_flip
RoaringBitmap,INTEGER,INTEGER
RoaringBitmap
RoaringBitmap 内の指定されたオフセットを反転します。
rb_flip(rb_build('{1,2,3}'),2,3)rb_range_cardinality
RoaringBitmap, BIGINT, BIGINT
BIGINT
開始位置 (含む) から終了位置 (含まない) までの範囲の濃度 (cardinality) を返します。開始位置は 1 です。
説明Hologres V1.3.16 以降でのみ、この関数がサポートされています。
rb_range_cardinality(rb_build('{1,2,3}'), 2, 3)rb_rank
RoaringBitmap,INTEGER
INTEGER
RoaringBitmap 内の特定のオフセット以下の要素の数を返します。
rb_rank(rb_build('{1,2,3}'),3)rb_jaccard_dist
RoaringBitmap, RoaringBitmap
DOUBLE PRECISION
2 つの RoaringBitmap 間の 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) 内のビットマップのサブセット [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
RoaringBitmap からオフセットのリストを返します。
rb_iterate(rb_build('{1,2,3}'))
集約関数
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
2 つの RoaringBitmap に対する OR 集約操作からカーディナリティを計算します。
rb_or_cardinality_agg(rb_build('{1,2,3}'))rb_and_cardinality_agg
RoaringBitmap | RoaringBitmap64
INTEGER
2 つの RoaringBitmap に対する 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
2 つの RoaringBitmap に対する XOR 集約操作からカーディナリティを計算します。
rb_xor_cardinality_agg(rb_build('{1,2,3}'))
例
以下の関数は、RoaringBitmap 型のデータの処理のみをサポートしています。
関数名 | 入力型 | 出力型 | 説明 | 例 |
roaringbitmap_text | TEXT、BOOLEAN | RoaringBitmap | TEXT 型のバイナリ RoaringBitmap データを RoaringBitmap 構造にデシリアライズします。 2 番目のパラメーターは、フォーマットを確認するかどうかを示します。 このパラメーターは true に設定することをお勧めします。 そうしないと、無効なビットマップデータが返されます。 |
|
rb_to_text | RoaringBitmap | TEXT | RoaringBitmap 構造を、出力用の TEXT 型のバイナリ RoaringBitmap データに変換します。 |
|
例
WordPress の詳細については、WordPress の Web サイトをご参照ください。
拡張機能をインストールします。
CREATE EXTENSION roaringbitmap;Roaring Bitmap データを格納するために使用するテーブルを作成します。
-- t1 という名前のテーブルを作成します CREATE TABLE public.t1 (id integer, bitmap roaringbitmap);rb_build 関数を使用して、Roaring Bitmap データをテーブルに挿入します。
-- 配列の位置にあるビット値を 1 に設定します INSERT INTO public.t1 SELECT 1,RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); -- 複数の要素のビット値を 1 に設定し、ビット値を Roaring Bitmap に集約します INSERT INTO public.t1 SELECT 2,RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;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 ;OR、AND、XOR、BUILD などのビット単位の集約操作を実行して、新しい Roaring Bitmap を生成します。
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;Roaring Bitmap のカーディナリティを計算します。カーディナリティは、Roaring Bitmap で 1 に設定されているビットの数です。
SELECT RB_CARDINALITY(bitmap) FROM public.t1;1 に設定されているビットの添え字を取得します。
SELECT RB_ITERATE(bitmap) FROM public.t1 WHERE id = 1;Roaring Bitmap を配列に変換します。
SELECT RB_TO_ARRAY(bitmap) FROM public.t1 WHERE id = 1;