在doris中还有一个类型是bitmap,这个主要是为某张表单独创建一个字段,用于做精准去重,这样子的话,在做distinct的时候会非常快。下面用案例介绍下。
一、创建一张shop_product_bitmap的表
CREATE TABLE `shop_product_bitmap` ( `shop_id` int(11) NULL COMMENT "店铺id", `shop_name` varchar(255) NULL COMMENT "店铺名称", `product_id` bitmap BITMAP_UNION NULL COMMENT "产品id" ) ENGINE=OLAP AGGREGATE KEY(`shop_id`, `shop_name`) COMMENT "OLAP" DISTRIBUTED BY HASH(`shop_id`) BUCKETS 3 PROPERTIES ( "replication_allocation" = "tag.location.default: 1", "in_memory" = "false", "storage_format" = "V2" );
重点:
1、在表里面我们为product_id做一个bitmap类型,到时候去重就直接查询product_id就可以了。
2、需要有一个id类型的作为分桶,一般我们选择的字段枚举数值量一定要超过buckets桶的5倍及以上,这里主要是为了查询的时候减小内存的使用,做优化用。
二、我们插入几条数据
insert into shop_product_bitmap values(1,'张三的店铺',to_bitmap(1001)); insert into shop_product_bitmap values(2,'张三的店铺',to_bitmap(1002)); insert into shop_product_bitmap values(3,'张三的店铺',to_bitmap(1003)); insert into shop_product_bitmap values(4,'张三的店铺',to_bitmap(1004)); insert into shop_product_bitmap values(5,'李四的店铺',to_bitmap(1001)); insert into shop_product_bitmap values(6,'李四的店铺',to_bitmap(1002)); insert into shop_product_bitmap values(7,'李四的店铺',to_bitmap(1003)); insert into shop_product_bitmap values(8,'李四的店铺',to_bitmap(1004)); insert into shop_product_bitmap values(9,'李四的店铺',to_bitmap(1005));
重点:
1、在插入bitmap类型的时候,我们需要把原始值使用to_bitmap函数进行转换。
2、插入后的值我们是看不到的是空的,例如:
所以在真实的使用上,我们需要把product_id单独再做一列,以方便查询原始值。
三、如果使用bitmap进行精准去重呢?
这里主要使用的函数是:orthogonal_bitmap_union_count,示例sql如下:
select orthogonal_bitmap_union_count(product_id) from shop_product_bitmap;
可以看到返回了去重后的结果。
这就是bitmap去重。
备注:
1、这里使用的orthogonal_bitmap_union_count函数去重,主要是对应的bitmap类型的字段。这个方式主要是应用在数据量非常大的,例如几千万,上亿的数据量的数据精准去重。
2、如果数据量少的话,可以不使用单独做成这种bitmap字段的表,直接使用如下的sql即可:
select BITMAP_UNION_INT(shop_id) from shop_product_bitmap;
还没有评论,来说两句吧...