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

bitmap

Вот простой пример, иллюстрирующий использование нескольких агрегатных функций в Bitmap. Для подробных определений функций или дополнительных функций Bitmap см. bitmap-functions.

Создание таблицы

При создании таблицы необходима модель агрегации. Тип данных — bitmap, а агрегатная функция — bitmap_union.

CREATE TABLE `pv_bitmap` (
`dt` int(11) NULL COMMENT "",
`page` varchar(10) NULL COMMENT "",
`user_id` bitmap BITMAP_UNION NULL COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`dt`, `page`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`dt`);

Примечание: При больших объемах данных лучше создать rollup-таблицу, соответствующую часто используемой bitmap_union.

ALTER TABLE pv_bitmap ADD ROLLUP pv (page, user_id);

Загрузка данных

TO_BITMAP (expr): Преобразует unsigned bigint от 0 до 18446744073709551615 в bitmap

BITMAP_EMPTY (): Генерирует пустые bitmap-столбцы, используется в качестве значения по умолчанию для заполнения при вставке или вводе

BITMAP_HASH (expr): Преобразует столбцы любого типа в bitmap с помощью хеширования

Stream Load

При вводе данных с использованием Stream Load можно преобразовать данные в поле Bitmap следующим образом:

cat data | curl --location-trusted -u user:passwd -T - \
-H "columns: dt,page,user_id, user_id=to_bitmap(user_id)" \
http://host:8410/api/test/testDb/_stream_load
cat data | curl --location-trusted -u user:passwd -T - \
-H "columns: dt,page,user_id, user_id=bitmap_hash(user_id)" \
http://host:8410/api/test/testDb/_stream_load
cat data | curl --location-trusted -u user:passwd -T - \
-H "columns: dt,page,user_id, user_id=bitmap_empty()" \
http://host:8410/api/test/testDb/_stream_load

Insert Into

При вводе данных с использованием Insert Into необходимо выбрать соответствующий режим на основе типа столбцов в исходной таблице.

  • Тип столбца id2 в исходной таблице — bitmap
insert into bitmap_table1
select id, id2 from bitmap_table2;
  • Тип столбца id2 в целевой таблице — bitmap
insert into bitmap_table1 (id, id2)
values (1001, to_bitmap(1000))
, (1001, to_bitmap(2000));
  • Тип столбца id2 в исходной таблице — bitmap, и это результат агрегации с использованием bit_map_union().
insert into bitmap_table1
select id, bitmap_union(id2) from bitmap_table2 group by id;
  • Тип столбца id2 в исходной таблице — INT, и тип bitmap генерируется с помощью to_bitmap().
insert into bitmap_table1
select id, to_bitmap(id2) from table;
  • Тип столбца id2 в исходной таблице — STRING, и тип bitmap генерируется с помощью bitmap_hash().
insert into bitmap_table1
select id, bitmap_hash(id2) from table;

Запрос данных

Синтаксис

BITMAP_UNION (expr): Вычисляет объединение входных Bitmap и возвращает новый Bitmap.

BITMAP_UNION_COUNT (expr): Вычисляет объединение входных Bitmap и возвращает его мощность, эквивалентно BITMAP_COUNT (BITMAP_UNION (expr)). Рекомендуется сначала использовать функцию BITMAP_UNION_COUNT, поскольку ее производительность лучше, чем у BITMAP_COUNT (BITMAP_UNION (expr)).

BITMAP_UNION_INT (expr): Вычисляет количество различных значений в столбцах типа TINYINT, SMALLINT и INT, возвращает значение, аналогичное COUNT (DISTINCT expr).

INTERSECT_COUNT (bitmap_column_to_count, filter_column, filter_values ...): Вычисляет мощность пересечения нескольких bitmap, удовлетворяющих условию filter_column. bitmap_column_to_count — это столбец типа bitmap, filter_column — столбец различных измерений, а filter_values — список значений измерений.

BITMAP_INTERSECT(expr): Вычисляет пересечение этой группы значений bitmap и возвращает новый bitmap.

Пример

Следующий SQL использует таблицу pv_bitmap выше в качестве примера:

Вычисление дедуплицированного значения для user_id:

select bitmap_union_count(user_id)
from pv_bitmap;

select bitmap_count(bitmap_union(user_id))
from pv_bitmap;

Вычисление дедуплицированного значения id:

select bitmap_union_int(id)
from pv_bitmap;

Вычисление удержания user_id:

select intersect_count(user_id, page, 'game') as game_uv,
intersect_count(user_id, page, 'shopping') as shopping_uv,
intersect_count(user_id, page, 'game', 'shopping') as retention -- Количество пользователей, которые посещают как страницу 'game', так и страницу 'shopping'
from pv_bitmap
where page in ('game', 'shopping');

keyword

BITMAP,BITMAP_COUNT,BITMAP_EMPTY,BITMAP_UNION,BITMAP_UNION_INT,TO_BITMAP,BITMAP_UNION_COUNT,INTERSECT_COUNT,BITMAP_INTERSECT