Apache Doris 系列: 基础篇-使用BitMap函数精准去重(2)

1. 背景

Apache Doris 原有的BitMap函数虽然比较通用, 但在亿级别的BitMap大基数并交计算性能较差,主要是由以下两个原因造成的:

  • 当BitMap的基数过大,大小超过1GB时,网络或者磁盘的处理时间较长
  • BE节点扫描完数据后传输到一个FE节点进行并交计算,给该FE节点带来压力,成为处理瓶颈

解决方案:将bitmap列的值按照范围划分,不同范围的值存储在不同的bucket上,确保在不同bucket的bitmap值是正交的。在查询的时候,先对不同bucket的bitmap值完成聚合计算,上层的FE节点只需合并聚合过的数据并输出即可。如此会极大的改善计算效率,和解决FE节点成为计算瓶颈的问题。

2. 使用指南

增加一列hid, 表示range的范围,作为hash分桶列

如:

CREATE TABLE ssb.`lineorder_bitmap` (
  `lo_shipmode` varchar(50) NULL COMMENT "user tag",
  `hid` smallint(6) NULL COMMENT "Bucket ID",
  `lo_orderkey` bitmap BITMAP_UNION NULL COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`lo_shipmode`, `hid`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`hid`) BUCKETS 3
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"in_memory" = "false",
"storage_format" = "V2",
"disable_auto_compaction" = "false"
);

3. 实际查询效果

3.1 分组去重
select 
lo_shipmode
,orthogonal_bitmap_union_count(lo_orderkey) cnt
from ssb.`lineorder_bitmap` 
group by lo_shipmode

在这里插入图片描述

查询结果与上一篇使用COUNT(DISTINCT)的结果一致。
耗时对比:
COUNT(DISTINCT) : 12秒
bitmap_count(bitmap_union(to_bitmap(lo_orderkey))):6秒
本文使用的orthogonal_bitmap_union_count(lo_orderkey):219毫秒
计算性能得到了极大的提升。

3.2 全量去重
select orthogonal_bitmap_union_count(lo_orderkey) cnt from ssb.`lineorder_bitmap`

COUNT(DISTINCT) : 2.15秒
bitmap_count(bitmap_union(to_bitmap(lo_orderkey))):3.26秒
本文使用的orthogonal_bitmap_union_count(lo_orderkey):141毫秒
同样,计算性能也是得到了极大的提升。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修破立生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值