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

BITMAP

Тип BITMAP обычно используется для точной дедупликации, хранения тегов профилей пользователей и подобных задач. В этом документе описаны правила проектирования таблиц со столбцами BITMAP в Apache Doris и показаны два варианта загрузки через Stream Load: для BITMAP с одним элементом и с несколькими элементами.

Ограничения типа BITMAP​

Перед загрузкой данных BITMAP ознакомьтесь со следующими ограничениями:

ОграничениеОписание
Поддерживаемые модели таблицТаблица Duplicate, таблица Unique, таблица Aggregate
Позиция столбцаМожет использоваться только как столбец Value, но не как столбец Key
Требование к таблице AggregateВ таблице Aggregate столбец BITMAP должен использовать тип агрегации BITMAP_UNION
Длина и значение по умолчаниюУказывать длину и значение по умолчанию не требуется; система автоматически определяет длину в зависимости от уровня агрегации

Подробнее о типе см. в разделе Тип данных BITMAP.

Сценарий 1: загрузка данных BITMAP с одним элементом​

Этот вариант подходит, если каждая строка исходных данных содержит только одно целое число. Используйте функцию to_bitmap, чтобы преобразовать целое число в BITMAP.

Шаг 1: подготовьте данные​

Создайте файл CSV test_bitmap.csv, в котором каждая строка содержит одно целое число:

1|koga|17723
2|nijg|146285
3|lojn|347890
4|lofn|489871
5|jfin|545679
6|kon|676724
7|nhga|767689
8|nfubg|879878
9|huang|969798
10|buag|97997

Шаг 2: создайте целевую таблицу​

Создайте таблицу Aggregate со столбцом BITMAP в базе данных testdb:

CREATE TABLE testdb.test_bitmap(
typ_id BIGINT NULL COMMENT "ID",
hou VARCHAR(10) NULL COMMENT "one",
arr BITMAP BITMAP_UNION NOT NULL COMMENT "two"
)
AGGREGATE KEY(typ_id,hou)
DISTRIBUTED BY HASH(typ_id,hou) BUCKETS 10;

Шаг 3: выполните загрузку через Stream Load​

Используйте функцию to_bitmap, чтобы преобразовать столбец целых чисел в BITMAP:

curl --location-trusted -u <doris_user>:<doris_password> \
-H "column_separator:|" \
-H "columns:typ_id,hou,arr,arr=to_bitmap(arr)" \
-T test_bitmap.csv \
-XPUT http://<fe_ip>:<fe_http_port>/api/testdb/test_bitmap/_stream_load

Шаг 4: проверьте результат загрузки​

Используйте bitmap_to_string, чтобы преобразовать BITMAP обратно в строку и просмотреть загруженные данные:

mysql> select typ_id,hou,bitmap_to_string(arr) from testdb.test_bitmap;
+--------+-------+-----------------------+
| typ_id | hou | bitmap_to_string(arr) |
+--------+-------+-----------------------+
| 4 | lofn | 489871 |
| 6 | kon | 676724 |
| 9 | huang | 969798 |
| 3 | lojn | 347890 |
| 8 | nfubg | 879878 |
| 7 | nhga | 767689 |
| 1 | koga | 17723 |
| 2 | nijg | 146285 |
| 5 | jfin | 545679 |
| 10 | buag | 97997 |
+--------+-------+-----------------------+
10 rows in set (0.07 sec)

Сценарий 2: загрузка данных BITMAP с несколькими элементами​

Если каждая строка исходных данных содержит несколько целых чисел (например, несколько идентификаторов пользователей), выберите один из следующих двух способов в зависимости от формата исходного файла. Различия между способами приведены ниже:

СпособФормат исходного файлаТребуется преобразование через castПримечания
bitmap_from_stringЗначения через запятую, квадратные скобки недопустимыНетКвадратные скобки считаются ошибкой качества данных
bitmap_from_arrayЗначения через запятую, квадратные скобки допустимыНеобходимо выполнить cast к типу array<int>Без преобразования загрузка завершается ошибкой из-за несоответствия сигнатуры функции

Способ A: использование bitmap_from_string​

Требования к формату данных​

В столбце arr исходного файла значения разделяются запятыми и не должны содержать квадратных скобок:

1|koga|17,723
2|nijg|146,285
3|lojn|347,890
4|lofn|489,871
5|jfin|545,679
6|kon|676,724
7|nhga|767,689
8|nfubg|879,878
9|huang|969,798
10|buag|97,997

Команда Stream Load​

curl --location-trusted -u <doris_user>:<doris_password> \
-H "column_separator:|" \
-H "columns:typ_id,hou,arr,arr=bitmap_from_string(arr)" \
-T test_bitmap.csv \
-XPUT http://<fe_ip>:<fe_http_port>/api/testdb/test_bitmap/_stream_load

Способ B: использование bitmap_from_array​

Требования к формату данных​

Столбец arr исходного файла может содержать квадратные скобки:

1|koga|[17,723]
2|nijg|[146,285]
3|lojn|[347,890]
4|lofn|[489,871]
5|jfin|[545,679]
6|kon|[676,724]
7|nhga|[767,689]
8|nfubg|[879,878]
9|huang|[969,798]
10|buag|[97,997]

Команда Stream Load​

В Stream Load сначала необходимо выполнить cast строки к типу array<int>, а затем преобразовать её с помощью bitmap_from_array:

curl --location-trusted -u <doris_user>:<doris_password> \
-H "column_separator:|" \
-H "columns:typ_id,hou,arr_str,arr=bitmap_from_array(cast(arr_str as array<int>))" \
-T test_bitmap.csv \
-XPUT http://<fe_ip>:<fe_http_port>/api/testdb/test_bitmap/_stream_load

Устранение неполадок​

Ошибка «функция не существует» при использовании bitmap_from_array​

Пример ошибки:

[ANALYSIS_ERROR]TStatus: errCode = 2, detailMessage = Does not support non-builtin functions, or function does not exist: bitmap_from_array(<slot 8>)
  • Причина: строка не была явно приведена к типу array<int>, поэтому не удаётся подобрать подходящую сигнатуру функции bitmap_from_array.
  • Решение: в параметре columns метода Stream Load используйте cast(arr_str as array<int>) для явного преобразования типа.

Как просмотреть содержимое столбца BITMAP в запросах​

BITMAP представляет собой двоичный агрегатный тип, содержимое которого нельзя просмотреть напрямую с помощью SELECT. Для этого необходимо преобразовать его с помощью функций:

  • bitmap_to_string(col): преобразует BITMAP в строку со значениями, разделёнными запятыми.
  • bitmap_count(col): возвращает количество уникальных элементов в BITMAP.

Почему BITMAP нельзя использовать в качестве столбца Key​

BITMAP представляет собой агрегатный двоичный тип. Его нельзя использовать в качестве столбца Key для сортировки или дедупликации. Он может храниться только в столбце Value для сохранения результатов агрегации.