跳到主要内容
版本: 最新版本-3.5

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