Les bitmaps Roaring sont des structures de données compressées efficaces, prises en charge par de nombreux langages de programmation et plateformes de big data. Dans Hologres, les fonctions Roaring Bitmap conviennent aux charges de travail à très haute cardinalité : déduplication, filtrage par tag et collecte de séries temporelles.
Fonctionnement
Un bitmap Roaring divise les entiers 32 bits en blocs de 2^16. Les entiers d'un même bloc partagent les 16 bits de poids fort ; les 16 bits de poids faible sont stockés dans un conteneur. Un tableau dynamique sert d'index primaire pour ces conteneurs.
Deux types de conteneurs optimisent le stockage et les performances :
| Type de conteneur | Utilisation | Capacité |
|---|---|---|
| Conteneur Array (tableau) | Blocs clairsemés | Jusqu'à 4 096 entiers |
| Conteneur Bitmap | Blocs denses | Plus de 4 096 entiers |
Cette structure permet une récupération rapide des valeurs et des opérations binaires efficaces (AND, OR, XOR) entre les conteneurs.
Limites
-
Seules les instances exclusives Hologres V0.10 et ultérieures prennent en charge les fonctions Roaring Bitmap.
Vérifiez la version de votre instance dans la console Hologres. Si la version est antérieure à la V0.10, mettez l'instance à niveau dans la console ou rejoignez le groupe DingTalk pour obtenir une assistance technique. Consultez les rubriques Common upgrade preparation failure errors et Obtain online support for Hologres .
Les fonctions Roaring Bitmap sont chargées par défaut dans le schéma public et ne peuvent être installées que dans ce schéma.
À partir de Hologres V3.1, le type de données RoaringBitmap64 est pris en charge. Certaines fonctions Roaring Bitmap peuvent traiter des données de type RoaringBitmap64. Cependant, lors du traitement de données RoaringBitmap64, ces fonctions n'acceptent pas les paramètres d'entrée constants.
-
Avant d'utiliser les fonctions Roaring Bitmap, activez l'extension avec l'instruction suivante. L'extension s'applique à une base de données spécifique : exécutez cette instruction une fois par base de données. Répétez l'opération pour chaque nouvelle base de données créée.
-- Enable the extension. CREATE EXTENSION roaringbitmap;Pour supprimer l'extension :
DROP EXTENSION roaringbitmap;ImportantÉvitez d'utiliser
DROP EXTENSION <extension_name> CASCADE;. L'option CASCADE supprime l'extension ainsi que toutes ses données et tous les objets dépendants, y compris les données PostGIS, les données Roaring Bitmap, les données Proxima, les données de journaux binaires (binary log) et les données BSI, ainsi que les métadonnées, tables, vues et objets serveur dépendants. Les colonnes Roaring Bitmap ne peuvent pas servir d'index bitmap ou dictionary.
-
Lors de la création d'une table contenant une colonne Roaring Bitmap, spécifiez explicitement le type de colonne comme
roaringbitmap(32 bits) ouroaringbitmap64(64 bits). Les calculs mixtes entre ces deux types ne sont pas pris en charge.-- Create a table with a 32-bit roaring bitmap column. CREATE TABLE t_rb_32 ( bucket int, x roaringbitmap ); -- Create a table with a 64-bit roaring bitmap column. CREATE TABLE t_rb_64 ( bucket int, x roaringbitmap64 ); -- Mixed calculations return an error. -- 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;
Opérateurs
Sauf indication contraire, tous les opérateurs ci-dessous prennent en charge les types RoaringBitmap et RoaringBitmap64.
| Opérateur | Type d'entrée | Type de sortie | Description | Exemple | Résultat | ||||
|---|---|---|---|---|---|---|---|---|---|
& |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | Identique à l'entrée | AND |
|
|
||
`\ |
` | RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | Identique à l'entrée |
OR |
|
rb_build('{3,4,5}')` |
|
`\ |
` | RoaringBitmap \ | RoaringBitmap64, INTEGER | RoaringBitmap \ | RoaringBitmap64 |
OR (bitmap, entier) ; V1.3.16+ |
|
6` |
|
`\ |
` | INTEGER, RoaringBitmap \ | RoaringBitmap64 | RoaringBitmap \ | RoaringBitmap64 |
OR (entier, bitmap) ; V1.3.16+ |
|
rb_build('{1,2,3}')` |
|
# |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | Identique à l'entrée | XOR |
|
|
||
<< |
RoaringBitmap \ | RoaringBitmap64, BIGINT | RoaringBitmap \ | RoaringBitmap64 | Décalage vers la gauche ; V1.3.16+ |
|
|
||
>> |
RoaringBitmap \ | RoaringBitmap64, BIGINT | RoaringBitmap \ | RoaringBitmap64 | Décalage vers la droite ; V1.3.16+ |
|
— |
||
- |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | Identique à l'entrée | ANDNOT (bitmap, bitmap) ; V1.3.16+ |
|
|
||
- |
RoaringBitmap \ | RoaringBitmap64, INTEGER | RoaringBitmap \ | RoaringBitmap64 | ANDNOT (bitmap, entier) |
|
|
||
@> |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | BOOLEAN | A contient B |
|
|
||
@> |
RoaringBitmap \ | RoaringBitmap64, INTEGER | BOOLEAN | A contient l'entier | rb_build('{1,2,3}') @> 3 |
|
|||
<@ |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | BOOLEAN | A est contenu dans B |
|
|
||
<@ |
INTEGER, RoaringBitmap \ | RoaringBitmap64 | BOOLEAN | L'entier est contenu dans A | 3 <@ rb_build('{1,2,3}') |
|
|||
&& |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | BOOLEAN | A intersecte B |
|
|
||
= |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | BOOLEAN | Égal à |
|
|
||
<> |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | BOOLEAN | Différent de |
|
|
Fonctions Roaring Bitmap
Fonctions prenant en charge RoaringBitmap et RoaringBitmap64
| Fonction | Type d'entrée | Type de sortie | Description | Exemple | Résultat | ||
|---|---|---|---|---|---|---|---|
rb_build_agg |
INTEGER \ | BIGINT | RoaringBitmap \ | RoaringBitmap64 | Agrège les décalages dans un bitmap Roaring. L'entrée BIGINT (renvoyant RoaringBitmap64) nécessite la version V3.1 ou ultérieure. |
|
|
rb_cardinality |
RoaringBitmap \ | RoaringBitmap64 | INTEGER | Renvoie le nombre d'éléments dans un bitmap Roaring. | rb_cardinality(rb_build('{1,2,3,4,5}')) |
|
|
rb_and_cardinality |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | INTEGER | Renvoie la cardinalité du AND de deux bitmaps Roaring. |
|
|
rb_or_cardinality |
RoaringBitmap \ | RoaringBitmap64, RoaringBitmap \ | RoaringBitmap64 | INTEGER | Renvoie la cardinalité du OR de deux bitmaps Roaring. |
|
|
rb_range |
RoaringBitmap \ | RoaringBitmap64, BIGINT, BIGINT | RoaringBitmap \ | RoaringBitmap64 | Renvoie les éléments dans la plage [start, end), où start est basé sur 1. Nécessite la version V1.3.16 ou ultérieure. |
|
— |
rb_minimum |
RoaringBitmap \ | RoaringBitmap64 | INTEGER | Renvoie le décalage minimum. Renvoie -1 si le bitmap est vide. | rb_minimum(rb_build('{1,2,3}')) |
|
|
rb_maximum |
RoaringBitmap \ | RoaringBitmap64 | INTEGER | Renvoie le décalage maximum. Renvoie 0 si le bitmap est vide. | rb_maximum(rb_build('{1,2,3}')) |
|
|
rb_to_array |
RoaringBitmap \ | RoaringBitmap64 | INTEGER[] | Convertit un bitmap Roaring en tableau d'entiers. | rb_to_array(rb_build('{1,2,3}')) |
|
|
rb_to_array_string |
RoaringBitmap \ | RoaringBitmap64, TEXT | TEXT | Convertit un bitmap Roaring en chaîne, en joignant les éléments avec le délimiteur spécifié. | rb_to_array_string(rb_build('{1,2,3}'), ',') |
|
Fonctions prenant uniquement en charge RoaringBitmap64
| Fonction | Type d'entrée | Type de sortie | Description | Exemple | Résultat |
|---|---|---|---|---|---|
rb64_build |
BIGINT[] | RoaringBitmap64 | Crée un bitmap Roaring 64 bits à partir d'un tableau BIGINT. Nécessite la version V3.1 ou ultérieure. | Voir l'exemple ci-dessous. | — |
-- 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;
Sortie attendue :
rb_num | num
--------------------------------------------------------------------------------+------
\x030100000000000000000000003a30000001000000000001001000000001000200 | {1,2}
Fonctions prenant uniquement en charge RoaringBitmap (32 bits)
| Fonction | Type d'entrée | Type de sortie | Description | Exemple | Résultat |
|---|---|---|---|---|---|
rb_build |
INTEGER[] | RoaringBitmap | Crée un bitmap Roaring 32 bits à partir d'un tableau d'entiers. | rb_build('{1,2,3,4,5}') |
{1,2,3,4,5} |
roaringbitmap_in |
TEXT | RoaringBitmap | Convertit un bitmap Roaring encodé en TEXT au type RoaringBitmap. Nécessite la version V2.1.33 ou ultérieure. | Voir l'exemple ci-dessous. | — |
rb_index |
RoaringBitmap, INTEGER | BIGINT | Renvoie l'index basé sur 0 d'un élément. Renvoie -1 si l'élément est absent. Nécessite la version V1.3.16 ou ultérieure. | rb_index(rb_build('{1,2,3}'), 3) |
2 |
rb_and_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | Opération AND. Si une entrée est NULL, renvoie l'autre entrée ; si une entrée est un bitmap vide ({}), renvoie {}. Nécessite la version V1.1.42 ou ultérieure. | rb_and_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{} |
rb_or_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | Opération OR ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. | rb_or_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{3,4,5} |
rb_andnot_null2empty |
RoaringBitmap, RoaringBitmap | RoaringBitmap | Opération ANDNOT ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. | rb_andnot_null2empty(rb_build(null), rb_build('{3,4,5}')) |
{} |
rb_and_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Renvoie la cardinalité AND. Traite les entrées NULL comme des bitmaps vides ({}). Nécessite la version V1.1.42 ou ultérieure. | rb_and_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
0 |
rb_or_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Renvoie la cardinalité OR ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. | rb_or_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
3 |
rb_xor_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Renvoie la cardinalité du XOR de deux bitmaps Roaring. | rb_xor_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
4 |
rb_andnot_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Renvoie la cardinalité du ANDNOT de deux bitmaps Roaring. | rb_andnot_cardinality(rb_build('{1,2,3}'), rb_build('{3,4,5}')) |
2 |
rb_andnot_null2empty_cardinality |
RoaringBitmap, RoaringBitmap | INTEGER | Renvoie la cardinalité ANDNOT ; traite les entrées NULL comme des bitmaps vides. Nécessite la version V1.1.42 ou ultérieure. | rb_andnot_null2empty_cardinality(rb_build(null), rb_build('{3,4,5}')) |
0 |
rb_is_empty |
RoaringBitmap | BOOLEAN | Vérifie si un bitmap Roaring est vide. | rb_is_empty(rb_build('{1,2,3,4,5}')) |
false |
rb_fill |
RoaringBitmap, BIGINT, BIGINT | RoaringBitmap | Remplit les décalages dans [start, end), en excluant la fin. Nécessite la version V1.3.16 ou ultérieure. | rb_fill(rb_build('{1,2,3}'), 5, 7) |
{1,2,3,5,6} |
rb_clear |
RoaringBitmap, BIGINT, BIGINT | RoaringBitmap | Efface les décalages dans [start, end), en excluant la fin. Nécessite la version V1.3.16 ou ultérieure. | rb_clear(rb_build('{1,2,3}'), 2, 3) |
— |
rb_contains_bitmap |
RoaringBitmap, RoaringBitmap | BOOLEAN | Vérifie si le premier bitmap contient tous les éléments du second. | rb_contains_bitmap(rb_build('{1,2,3}'), rb_build('{3}')) |
true |
rb_flip |
RoaringBitmap, INTEGER, INTEGER | RoaringBitmap | Inverse les décalages dans la plage spécifiée. | rb_flip(rb_build('{1,2,3}'), 2, 3) |
— |
rb_range_cardinality |
RoaringBitmap, BIGINT, BIGINT | BIGINT | Renvoie la cardinalité des éléments dans [start, end), où start est basé sur 1. Nécessite la version V1.3.16 ou ultérieure. | rb_range_cardinality(rb_build('{1,2,3}'), 2, 3) |
— |
rb_rank |
RoaringBitmap, INTEGER | INTEGER | Renvoie le nombre d'éléments inférieurs ou égaux au décalage spécifié. | rb_rank(rb_build('{1,2,3}'), 3) |
3 |
rb_jaccard_dist |
RoaringBitmap, RoaringBitmap | DOUBLE PRECISION | Renvoie la distance de Jaccard ou le coefficient de similarité de Jaccard entre deux bitmaps Roaring. Nécessite la version V1.3.16 ou ultérieure. | rb_jaccard_dist(rb_build('{1,2,3}'), rb_build('{3,4}')) |
0.75 |
rb_select |
RoaringBitmap, bitset_limit BIGINT, bitset_offset BIGINT=0, reverse BOOLEAN=false, range_start BIGINT=-2147483648, range_end BIGINT=2147483647 | RoaringBitmap | Renvoie le sous-ensemble [bitset_offset, bitset_offset+bitset_limit) de la plage [range_start, range_end). | rb_select(rb_build('{1,2,3,4,5,6,7,8,9}'), 5, 2) |
— |
rb_iterate |
RoaringBitmap | Set of INTEGER | Renvoie chaque décalage d'un bitmap Roaring sous forme de ligne. | rb_iterate(rb_build('{1,2,3}')) |
1, 2, 3 |
Exemple roaringbitmap_in :
-- Create a sample table.
CREATE TABLE rb_text (
id int,
a text
);
-- Insert data.
INSERT INTO rb_text
VALUES (1, '\x3a300000010000000000090010000000010002000300040005000600070008000900c800');
-- Convert to RoaringBitmap and compute AND cardinality.
SELECT
rb_and_cardinality_agg(roaringbitmap_in(a::cstring))
FROM
rb_text;
Sortie attendue :
rb_and_cardinality_agg
------------------------
10
Fonctions d'agrégation Roaring Bitmap
Fonctions prenant en charge RoaringBitmap et RoaringBitmap64
Tous les exemples ci-dessous utilisent une entrée multiligne pour illustrer la fusion de plusieurs bitmaps par agrégation.
| Fonction | Type d'entrée | Type de sortie | Description | Exemple | Résultat | |
|---|---|---|---|---|---|---|
rb_or_agg |
RoaringBitmap \ | RoaringBitmap64 | Identique à l'entrée | Agrégation OR sur toutes les lignes d'entrée. | Voir l'exemple ci-dessous. |
— |
rb_and_agg |
RoaringBitmap \ | RoaringBitmap64 | Identique à l'entrée | Agrégation AND sur toutes les lignes d'entrée. | Voir l'exemple ci-dessous. |
— |
rb_or_cardinality_agg |
RoaringBitmap \ | RoaringBitmap64 | INTEGER | Renvoie la cardinalité de l'agrégation OR. | Voir l'exemple ci-dessous. |
— |
rb_and_cardinality_agg |
RoaringBitmap \ | RoaringBitmap64 | INTEGER | Renvoie la cardinalité de l'agrégation AND. | Voir l'exemple ci-dessous. |
— |
-- OR aggregate: returns the union of all input bitmaps.
SELECT rb_or_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {1,2,3,4}
-- AND aggregate: returns the intersection of all input bitmaps.
SELECT rb_and_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {2,3}
-- OR cardinality aggregate.
SELECT rb_or_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 4
-- AND cardinality aggregate.
SELECT rb_and_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 2
Fonctions prenant uniquement en charge RoaringBitmap (32 bits)
| Fonction | Type d'entrée | Type de sortie | Description | Exemple | Résultat |
|---|---|---|---|---|---|
rb_xor_agg |
RoaringBitmap | RoaringBitmap | Agrégation XOR sur toutes les lignes d'entrée. | Voir l'exemple ci-dessous. | — |
rb_xor_cardinality_agg |
RoaringBitmap | INTEGER | Renvoie la cardinalité de l'agrégation XOR. | Voir l'exemple ci-dessous. | — |
-- XOR aggregate: returns elements in exactly one of the two bitmaps.
SELECT rb_xor_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: {1,4}
-- XOR cardinality aggregate.
SELECT rb_xor_cardinality_agg(bitmap)
FROM (VALUES
(rb_build('{1,2,3}')),
(rb_build('{2,3,4}'))
) t(bitmap);
-- Result: 2
Autres fonctions Roaring Bitmap
Les fonctions suivantes prennent uniquement en charge le type RoaringBitmap (32 bits).
| Fonction | Type d'entrée | Type de sortie | Description | Exemple | Résultat |
|---|---|---|---|---|---|
roaringbitmap_text |
TEXT, BOOLEAN | RoaringBitmap | Désérialise les données binaires RoaringBitmap depuis TEXT vers une structure RoaringBitmap. Le second paramètre contrôle la vérification du format : définissez-le sur true pour éviter les données de bitmap non valides. |
roaringbitmap_text(':0', true) |
— |
rb_to_text |
RoaringBitmap | TEXT | Convertit une structure RoaringBitmap en sa représentation binaire TEXT. | rb_to_text(rb_build('{1,2,3}')) |
\x3a300000... |
Exemples
L'exemple complet suivant illustre un flux de travail de bout en bout : activation de l'extension, création d'une table, insertion de données, exécution d'opérations binaires et inspection des résultats.
-
Activez l'extension.
CREATE EXTENSION roaringbitmap; -
Créez une table pour stocker les données Roaring Bitmap.
-- Create table t1. CREATE TABLE public.t1 (id integer, bitmap roaringbitmap); -
Insérez des données Roaring Bitmap.
-- Build a bitmap from an explicit array. INSERT INTO public.t1 SELECT 1, RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]); -- Build a bitmap by aggregating a generated series. INSERT INTO public.t1 SELECT 2, RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e; -
Exécutez des opérations binaires.
-- OR the two bitmaps. 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;Sortie attendue (l'union de {1..9, 200} et {1..100}) :
rb_or ------- {1,2,3,4,5,6,7,8,9,10,...,100,200} -
Exécutez des opérations d'agrégation pour combiner tous les bitmaps de la table.
SELECT RB_OR_AGG(bitmap) FROM public.t1; -- union of all bitmaps SELECT RB_AND_AGG(bitmap) FROM public.t1; -- intersection of all bitmaps SELECT RB_XOR_AGG(bitmap) FROM public.t1; -- symmetric difference SELECT RB_BUILD_AGG(id) FROM public.t1; -- build a bitmap from the id column -
Calculez la cardinalité (le nombre de bits définis).
SELECT RB_CARDINALITY(bitmap) FROM public.t1;Sortie attendue :
id | rb_cardinality ----+---------------- 1 | 10 2 | 100 -
Listez tous les décalages définis.
SELECT RB_ITERATE(bitmap) FROM public.t1 WHERE id = 1;Sortie attendue :
rb_iterate ------------ 1 2 3 4 5 6 7 8 9 200 -
Convertissez un bitmap Roaring en tableau.
SELECT RB_TO_ARRAY(bitmap) FROM public.t1 WHERE id = 1;Sortie attendue :
rb_to_array -------------------------------- {1,2,3,4,5,6,7,8,9,200}