Точная дедупликация с BITMAP
Точная дедупликация с BITMAP использует структуру данных bitmap для замены COUNT DISTINCT, обеспечивая высокую производительность точной дедупликации больших объёмов данных. По сравнению с COUNT DISTINCT использование Bitmap для точной дедупликации даёт следующие преимущества:
- Более быстрое выполнение запросов
- Меньшее потребление оперативной памяти и места на диске
Как реализован COUNT DISTINCT
Традиционная точная дедупликация основана на count distinct. Предположим, исходные данные выглядят следующим образом и вам нужно выполнить точную дедупликацию по столбцу name:
| id | name |
|---|---|
| 1 | bob |
| 2 | alex |
| 3 | jack |
| 4 | tom |
| 5 | bob |
| 6 | alex |
При выполнении select count(distinct name) from t Doris вычисляет результат, как показано на следующей схеме: сначала выполняет group by по столбцу name для первого этапа дедупликации, затем перераспределяет данные (shuffle) и выполняет второй этап дедупликации, а в конце вычисляет count.

Поскольку COUNT DISTINCT должен сохранять детальные данные во время вычислений и требует перераспределения данных (shuffle), запросы замедляются по мере роста объёма данных. Точная дедупликация с Bitmap предназначена для решения проблем производительности COUNT DISTINCT при работе с большими объёмами данных.
Сценарии использования
Bitmap сопоставляет детальные данные с позициями битов, жертвуя гибкостью работы с детальными данными ради значительного повышения эффективности вычислений. Рассмотрите использование Bitmap для точной дедупликации в следующих сценариях:
| Сценарий | Описание |
|---|---|
| Ускорение запросов | Bitmap использует битовые операции для вычислений при выполнении запросов, обеспечивая высокую производительность |
| Хранение со сжатием | Каждая запись детальных данных сжимается до одного бита, поэтому потребление места на диске и оперативной памяти значительно ниже, чем при хранении детальных данных |
Ограничения:
- Bitmap поддерживает точную дедупликацию только для типов данных
TINYINT,SMALLINT,INTиBIGINT - Для точной дедупликации данных других типов необходимо создать дополнительный глобальный словарь
- Столбцы типа Bitmap нельзя использовать в качестве столбцов Key
Doris реализует точную дедупликацию с Bitmap на основе RoaringBitmap. Принципы работы и подробности см. на сайте RoaringBitmap.
Выполнение точной дедупликации с BITMAP
Общий процесс состоит из трёх шагов: создание таблицы -> загрузка данных -> выполнение запроса к данным.
Шаг 1: Создание таблицы
Цель: Объявить целевой столбец с типом Bitmap и настроить агрегатную функцию BITMAP_UNION.
Примечания:
- При использовании Bitmap для дедупликации задайте целевому столбцу тип
Bitmapи агрегатную функциюBITMAP_UNIONв инструкцииCREATE TABLE - Столбцы типа Bitmap нельзя использовать в качестве столбцов Key
Пример: Создайте агрегатную таблицу test_bitmap, в которой столбец id содержит идентификатор посетившего пользователя, а столбец uv имеет тип BITMAP и использует агрегатную функцию BITMAP_UNION для агрегации данных.
create table test_bitmap(
dt date,
id int,
name char(10),
province char(10),
os char(10),
uv bitmap bitmap_union
)
Aggregate KEY (dt,id,name,province,os)
distributed by hash(id) buckets 10;
Шаг 2: Загрузка данных
Цель: Загрузить исходные детальные данные с помощью Stream Load и преобразовать их в тип Bitmap в процессе загрузки с помощью to_bitmap(id).
Пример данных (test_bitmap.csv):
2022-05-05,10001,test 01,Beijing,windows
2022-05-05,10002,test 01,Beijing,linux
2022-05-05,10003,test 01,Beijing,macos
2022-05-05,10004,test 01,Hebei,windows
2022-05-06,10001,test 01,Shanghai,windows
2022-05-06,10002,test 01,Shanghai,linux
2022-05-06,10003,test 01,Jiangsu,macos
2022-05-06,10004,test 01,Shaanxi,windows
Команда Stream Load:
curl --location-trusted -u root: -H "label:label_test_bitmap_load" \
-H "column_separator:," \
-H "columns:dt,id,name,province,os, uv=to_bitmap(id)" -T test_bitmap.csv http://fe_IP:8030/api/demo/test_bitmap/_stream_load
Шаг 3: Выполнение запроса к данным
Цель: Получить результат дедупликации столбца Bitmap с помощью агрегатной функции bitmap_union_count.
Для столбцов Bitmap нельзя напрямую запрашивать исходные значения; запросы к ним можно выполнять только через агрегатную функцию
bitmap_union_count.
Сценарий 1: Общее количество уникальных посетителей (UV)
mysql> select bitmap_union_count(uv) from test_bitmap;
+---------------------+
| bitmap_union_count(`uv`) |
+---------------------+
| 4 |
+---------------------+
1 row in set (0.00 sec)
Это эквивалентно следующему запросу:
mysql> SELECT COUNT(DISTINCT id) FROM test_bitmap;
+----------------------+
| count(DISTINCT `id`) |
+----------------------+
| 4 |
+----------------------+
1 row in set (0.01 sec)
Сценарий 2: Количество уникальных посетителей (UV) по дням
mysql> select bitmap_union_count(uv) from test_bitmap group by dt;
+---------------------+
| bitmap_union_count(`uv`) |
+---------------------+
| 4 |
| 4 |
+---------------------+
2 rows in set (0.01 sec)
Часто задаваемые вопросы
Вопрос 1: Какие типы данных поддерживает Bitmap для точной дедупликации?
Только TINYINT, SMALLINT, INT и BIGINT. Для дедупликации строк или данных других типов необходимо создать дополнительный глобальный словарь.
Вопрос 2: Можно ли использовать столбец Bitmap в качестве столбца Key?
Нет. Столбцы типа Bitmap можно использовать только в качестве столбцов Value, и для них обязательно нужно задать агрегатную функцию BITMAP_UNION.
Вопрос 3: Почему нельзя напрямую запрашивать исходные значения столбца Bitmap?
Bitmap представляет собой битовую карту и не хранит детальные данные. Результат дедупликации нужно получать через агрегатные функции, такие как bitmap_union_count.
Вопрос 4: Какие преимущества даёт Bitmap по сравнению с COUNT DISTINCT?
| Критерий сравнения | COUNT DISTINCT | Точная дедупликация с BITMAP |
|---|---|---|
| Способ вычисления | Хранение детальных данных + перераспределение (shuffle) для дедупликации | Битовые операции |
| Скорость запросов | Снижается при больших объёмах данных | Значительно выше |
| Потребление ресурсов | Детальные данные требуют много ресурсов | Низкое потребление места на диске и оперативной памяти |
| Типы данных | Любой тип | Только целочисленные типы; для других типов требуется глобальный словарь |