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`);
注意:对于大量数据,最好创建一个对应于高频 bitmap_union 的rollup表。
ALTER TABLE pv_bitmap ADD ROLLUP pv (page, user_id);
数据加载
TO_BITMAP (expr)
: 将 0 ~ 18446744073709551615 无符号 bigint 转换为 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 ...)
:计算满足 filter_column 条件的多个 bitmap 的交集的基数。 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 -- Number of users that access both the 'game' and 'shopping' pages
from pv_bitmap
where page in ('game', 'shopping');
关键词
BITMAP,BITMAP_COUNT,BITMAP_EMPTY,BITMAP_UNION,BITMAP_UNION_INT,TO_BITMAP,BITMAP_UNION_COUNT,INTERSECT_COUNT,BITMAP_INTERSECT