[TOC] #### 7.2.6.1 bitmap\_and **函数定义** `BITMAP BITMAP_AND(BITMAP lhs, BITMAP rhs)` 计算两个输入bitmap的交集,返回新的bitmap。 **示例** `mysql> select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(2))) cnt;` `+------+` `| cnt  |` `+------+` `|    0 |` `+------+` `mysql> select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(1))) cnt;` `+------+` `| cnt  |` `+------+` `|    1 |` `+------+` **关键字** `BITMAP_AND, BITMAP` #### 7.2.6.2 bitmap\_contains **函数定义** `B00LEAN BITMAP_CONTAINS(BITMAP bitmap, BIGINT input)` 计算输入值是否在Bitmap列中,返回值是Boolean值。 **示例** `mysql> select bitmap_contains(to_bitmap(1),2) cnt;` `+------+` `| cnt  |` `+------+` `|    0 |` `+------+` `mysql> select bitmap_contains(to_bitmap(1),1) cnt;` `+------+` `| cnt  |` `+------+` `|    1 |` `+------+` **关键字** `BITMAP_CONTAINS, BITMAP` #### 7.2.6.3 bitmap\_empty **函数定义** `BITMAP BITMAP_EMPTY()` 返回一个空Bitmap。主要用于 Insert Into 或 Stream Load 导入数据时填充默认值。例如: `cat data | curl --location-trusted -u user:passwd -T - -H "columns: dt,page,v1,v2=bitmap_empty()"   http://host:8410/api/test/testDb/_stream_load` **示例** `mysql> select bitmap_count(bitmap_empty());` `+------------------------------+` `| bitmap_count(bitmap_empty()) |` `+------------------------------+` `|                            0 |` `+------------------------------+` **关键字** `BITMAP_EMPTY, BITMAP` #### 7.2.6.4 bitmap\_from\_string **函数定义** `BITMAP BITMAP_FROM_STRING(VARCHAR input)` 将一个字符串转化为一个Bitmap。字符串是由逗号分隔的一组UINT32数字组成,比如"0, 1, 2"字符串会转化为一个Bitmap,其中的第0, 1, 2位被设置。当输入字段不合法时,返回NULL。 **示例** `mysql> select bitmap_to_string(bitmap_empty());` `+----------------------------------+` `| bitmap_to_string(bitmap_empty()) |` `+----------------------------------+` `|                                  |` `+----------------------------------+` `mysql> select bitmap_to_string(bitmap_from_string("0, 1, 2"));` `+-------------------------------------------------+` `| bitmap_to_string(bitmap_from_string('0, 1, 2')) |` `+-------------------------------------------------+` `| 0,1,2 |` `+-------------------------------------------------+` `mysql> select bitmap_from_string("-1, 0, 1, 2");` `+-----------------------------------+` `| bitmap_from_string('-1, 0, 1, 2') |` `+-----------------------------------+` `| NULL                              |` `+-----------------------------------+` **关键字** `BITMAP_FROM_STRING, BITMAP` #### 7.2.6.5 bitmap\_has\_any **函数定义** `B00LEAN BITMAP_HAS_ANY(BITMAP lhs, BITMAP rhs)` 计算两个Bitmap列是否存在相交元素,返回值是Boolean值。 **示例** `mysql> select bitmap_has_any(to_bitmap(1),to_bitmap(2)) cnt;` `+------+` `| cnt  |` `+------+` `|    0 |` `+------+` `mysql> select bitmap_has_any(to_bitmap(1),to_bitmap(1)) cnt;` `+------+` `| cnt  |` `+------+` `|    1 |` `+------+` **关键字** `BITMAP_HAS_ANY, BITMAP` #### 7.2.6.6 bitmap\_hash **函数定义** `BITMAP BITMAP_HASH(expr)` 对任意类型的输入计算32位的哈希值,返回包含该哈希值的Bitmap。主要用于Stream Load任务将非整型字段导入DorisDB表的Bitmap字段。例如: `cat data | curl --location-trusted -u user:passwd -T - -H "columns: dt,page,device_id, device_id=bitmap_hash(device_id)" http://host:8410/api/test/testDb/_stream_load` **示例** `mysql> select bitmap_count(bitmap_hash('hello'));` `+------------------------------------+` `| bitmap_count(bitmap_hash('hello')) |` `+------------------------------------+` `|                                  1 |` `+------------------------------------+` **关键字** `BITMAP_HASH, BITMAP` #### 7.2.6.7 bitmap\_or **函数定义** `BITMAP BITMAP_OR(BITMAP lhs, BITMAP rhs)` 计算两个输入Bitmap的并集,返回新的Bitmap。 **示例** `mysql> select bitmap_count(bitmap_or(to_bitmap(1), to_bitmap(2))) cnt;` `+------+` `| cnt  |` `+------+` `|    2 |` `+------+` `mysql> select bitmap_count(bitmap_or(to_bitmap(1), to_bitmap(1))) cnt;` `+------+` `| cnt  |` `+------+` `|    1 |` `+------+` **关键字** `BITMAP_OR, BITMAP` #### 7.2.6.8 bitmap\_to\_string **函数定义** `VARCHAR BITMAP_TO_STRING(BITMAP input)` 将一个Bitmap转化成一个逗号分隔的字符串,字符串中包含所有设置的BIT位。输入是NULL的话会返回NULL。 **示例** `mysql> select bitmap_to_string(null);` `+------------------------+` `| bitmap_to_string(NULL) |` `+------------------------+` `| NULL                   |` `+------------------------+` `mysql> select bitmap_to_string(bitmap_empty());` `+----------------------------------+` `| bitmap_to_string(bitmap_empty()) |` `+----------------------------------+` `|                                  |` `+----------------------------------+` `mysql> select bitmap_to_string(to_bitmap(1));` `+--------------------------------+` `| bitmap_to_string(to_bitmap(1)) |` `+--------------------------------+` `| 1 |` `+--------------------------------+` `mysql> select bitmap_to_string(bitmap_or(to_bitmap(1), to_bitmap(2)));` `+---------------------------------------------------------+` `| bitmap_to_string(bitmap_or(to_bitmap(1), to_bitmap(2))) |` `+---------------------------------------------------------+` `| 1,2 |` `+---------------------------------------------------------+` **关键字** `BITMAP_TO_STRING, BITMAP` #### 7.2.6.9 to\_bitmap **函数定义** `BITMAP TO_BITMAP(expr)` 输入为取值在 0 ~ 18446744073709551615 区间的 unsigned bigint ,输出为包含该元素的Bitmap。 该函数主要用于Stream Load任务将整型字段导入DorisDB表的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` **示例** `mysql> select bitmap_count(to_bitmap(10));` `+-----------------------------+` `| bitmap_count(to_bitmap(10)) |` `+-----------------------------+` `| 1 |` `+-----------------------------+` **关键字** `TO_BITMAP, BITMAP` #### 7.2.6.10 bitmap\_intersect **函数定义** `BITMAP BITMAP_INTERSECT(BITMAP value)` 输入一组 Bitmap 值,求这组 Bitmap 值的交集,并返回一个新的Bitmap。 该函数是聚合函数,用于计算分组后的 bitmap 交集。常见使用场景如计算用户留存率。 **示例** 表结构: `KeysType: AGG_KEY` `Columns: tag varchar, date datetime, user_id bitmap bitmap_union` 求今天和昨天不同 tag 下的用户留存: `mysql> select tag, bitmap_intersect(user_id) from (select tag, date, bitmap_union(user_id) user_id from table where date in ('2020-05-18', '2020-05-19') group by tag, date) a group by tag;` 该函数和bitmap\_to\_string函数组合使用可以获取交集的具体数据。求今天和昨天不同 tag 下留存的具体用户: `mysql> select tag, bitmap_to_string(bitmap_intersect(user_id)) from (select tag, date, bitmap_union(user_id) user_id from table where date in ('2020-05-18', '2020-05-19') group by tag, date) a group by tag;` **关键字** `BITMAP_INTERSECT, BITMAP` #### 7.2.6.11 bitmap\_union **函数定义** `BITMAP BITMAP_UNION(BITMAP value)` 输入一组 Bitmap 值,求这组 Bitmap 值的并集,并返回一个新的Bitmap。 该函数是聚合函数,用于计算分组后的 bitmap 并集。常见使用场景如计算PV,UV。 **示例** `mysql> select page_id, bitmap_union(user_id) from table group by page_id;` 和bitmap\_count函数组合使用可以求得网页的 PV 数据: `mysql> select page_id, bitmap_count(bitmap_union(user_id)) from table group by page_id;` 当 user\_id 字段为 int 时,上面查询语义等同于: `mysql> select page_id, count(distinct user_id) from table group by page_id;` **关键字** `BITMAP_UNION, BITMAP` <br> #### 7.2.6.12 bitmap\_andnot **函数定义** bitmap\_andnot(BITMAP lhs, BITMAP rhs) 计算得到在 **lhs** 中,但是不在 **rhs** 中的集合(差集),逻辑上等价于**bitmap\_andnot(bitmap\_or(lhs, rhs), bitmap\_and(lhs, rhs))**. **示例** ``` mysql> select bitmap\_to\_string(**bitmap\_andnot**(bitmap\_from\_string('1, 3'), bitmap\_from\_string('2'))) cnt; +------+ cnt +------+ 1,3 +------+ mysql> select bitmap\_to\_string(**bitmap\_andnot**(bitmap\_from\_string('1,3,5'), bitmap\_from\_string('1'))) cnt; +------+ cnt +------+ 3,5 +------+ ``` **关键字** `BITMAP_ANDNOT, BITMAP` <br> #### 7.2.6.13 bitmap\_xor **函数定义** bitmap\_xor(BITMAP lhs, BITMAP rhs) 计算得到 **lhs** 独有或者 **rhs** 独有的元素所构成的集合(补集)。 **示例** ``` mysql> select bitmap\_to\_string(**bitmap\_xor**(bitmap\_from\_string('1, 3'), bitmap\_from\_string('2'))) cnt; +------+ cnt +------+ 1,2,3 ``` **关键字** `BITMAP_XOR, BITMAP` <br> #### 7.2.6.14 bitmap\_remove **函数定义** bitmap\_remove(BITMAP lhs, BIGINT input) 从 lhs 中删除 **input** 作为结果集合返回。 **示例** ``` mysql> select bitmap\_to\_string(**bitmap\_remove**(bitmap\_from\_string('1, 3'), 3)) cnt; +------+ cnt +------+ 1 +------+ mysql> select bitmap\_to\_string(**bitmap\_remove**(bitmap\_from\_string('1,3,5'), 6)) cnt; +------+ cnt +------+ 1,3,5 +------+ ``` **关键字** `BITMAP_REMOVE, BITMAP` <br> #### 7.2.6.15 BITMAP\_TO\_ARRAY **函数定义** ARRAY\<BIGINT\> BITMAP\_TO\_ARRAY (BITMAP) 将 BIMTAP 转化为ARRAY\<BIGINT\>,将一个BIMTAP中的所有值组合成一个ARRAY\<BIGINT\> **示例** ``` mysql> select bitmap_to_array(bitmap_from_string("1, 7")); +----------------------------------------------+ | bitmap_to_array(bitmap_from_string('1, 7')) | +----------------------------------------------+ | [1,7] | +----------------------------------------------+ mysql> select bitmap_to_array(NULL); +-----------------------+ | bitmap_to_array(NULL) | +-----------------------+ | NULL | +-----------------------+ ``` **关键字** `BITMAP\_TO\_ARRAY, BITMAP `