Перейти к содержимому
Последнее обновление

Точная дедупликация с BITMAP

Точная дедупликация с BITMAP использует структуру данных bitmap для замены COUNT DISTINCT, обеспечивая высокую производительность точной дедупликации больших объёмов данных. По сравнению с COUNT DISTINCT использование Bitmap для точной дедупликации даёт следующие преимущества:

  • Более быстрое выполнение запросов
  • Меньшее потребление оперативной памяти и места на диске

Как реализован COUNT DISTINCT​

Традиционная точная дедупликация основана на count distinct. Предположим, исходные данные выглядят следующим образом и вам нужно выполнить точную дедупликацию по столбцу name:

idname
1bob
2alex
3jack
4tom
5bob
6alex

При выполнении 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.

Примечания:

  1. При использовании Bitmap для дедупликации задайте целевому столбцу тип Bitmap и агрегатную функцию BITMAP_UNION в инструкции CREATE TABLE
  2. Столбцы типа 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) для дедупликацииБитовые операции
Скорость запросовСнижается при больших объёмах данныхЗначительно выше
Потребление ресурсовДетальные данные требуют много ресурсовНизкое потребление места на диске и оперативной памяти
Типы данныхЛюбой типТолько целочисленные типы; для других типов требуется глобальный словарь