1.简介:

BloomFilter是一种多哈希函数映射的快速查找算法,它实际上是由一个超长的二进制位数组和一系列的哈希函数组成的。初始时二进制位数组全部为0,当给定一个待查询的元素时,这个元素会被一系列哈希函数计算映射出一系列的值,所有的值在位数组的偏移量处置为1,当该元素经过哈希函数计算后会得到所有的偏移位置,若这些位置全都为1,则判断该元素在这个集合中,若有一个不为1,则判断该元素不在这个集合中。

由于BloomFilter是一组哈希函数映射出来的结果,因此通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合,BloomFilter有以下特点:

1.空间效率高的概率型数据结构,用来检查一个元素是否在一个集合中;

2.对于一个元素检测是否存在的调用,BloomFilter会告诉调用者两个结果之一:可能存在或者一定不存在;

3.缺点是存在误判,告诉你可能存在,不一定真实存在;

例如:

前提条件:一个集合中,包含一些元素(j,q,k…),这些元素通过3个不同的哈希函数(x1,y1,z1)映射在二进制数组的比特位上。

当a元素由x1,y1和z1三个不同哈希函数映射在二进制数组上时,映射后三个位置的数值都等于1,因此,a元素可能存在于这个集合中。

当b元素由x1,y1和z1三个不同哈希函数映射在二进制数组上时,映射后有一个位置的数值等于0,因此b元素一定不在这个集合中。

2.Doris BloomFilter索引的使用:

Doris会自动在底层尽可能的使用一些索引和过滤机制,优化执行计划。但同时我们也可以手动创建BloomFilter索引。Doris的BloomFilter索引可以通过建表的时候指定,也可以通过表的ALTER操作来完成。

2.1创建BloomFilter索引:

可以通过在建表语句的PROPERTIES里加上"bloom_filter_columns"="c1,c2,c3"属性来创建Doris BloomFilter索引。c1,c2,c3是你要创建的BloomFilter索引的Key列名称。

CREATE TABLE `ods_test_bloom_delta` (`erdat` date NOT NULL COMMENT "",`vbelv` varchar(20) NULL COMMENT "",`posnv` varchar(10) NULL COMMENT "",`vbeln` varchar(20) NULL COMMENT "",,`city_org_code` varchar(20) NULL COMMENT "",`create_time` datetime NULL COMMENT ""
) ENGINE=OLAP
UNIQUE KEY(`erdat`, `vbelv`)
COMMENT "test_bloom"
PARTITION BY RANGE(`erdat`)
(PARTITION P_000000 VALUES [('0000-01-01'), ('2023-01-01')),
PARTITION P_202301 VALUES [('2023-01-01'), ('2023-02-01')),
PARTITION P_202302 VALUES [('2023-02-01'), ('2023-03-01')),
PARTITION P_202303 VALUES [('2023-03-01'), ('2023-04-01')),
PARTITION P_202304 VALUES [('2023-04-01'), ('2023-05-01')),
PARTITION P_202305 VALUES [('2023-05-01'), ('2023-06-01')),
PARTITION P_202306 VALUES [('2023-06-01'), ('2023-07-01')))
DISTRIBUTED BY HASH(`vbelv`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"bloom_filter_columns"="posnv,vbeln",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-2147483648",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "P_",
"dynamic_partition.replication_allocation" = "tag.location.default: 3",
"dynamic_partition.buckets" = "1",
"in_memory" = "false",
"storage_format" = "V2"
);
2.2修改BloomFilter索引
alter TABLE ods_test_bloom_delta SET ("bloom_filter_columns" = "city_org_code");
2.3删除BloomFilter索引
ALTER TABLE ods_test_bloom_delta SET ("bloom_filter_columns" = "");
2.4根据执行计划查看是否使用了BloomFilter索引:

根据explain可以查看执行计划,如图所示就说明查询已经使用了bloomFilter;

3.Doris BloomFilter使用场景及注意事项:

应用场景:

满足以下几个条件时可以考虑对某列建立Bloom Filter 索引:

1.首先BloomFilter适用于非前缀过滤.

2.查询会根据该列高频过滤,而且查询条件大多是in和 = 过滤.

3.不同于Bitmap, BloomFilter适用于高基数列。比如UserID。因为如果创建在低基数的列上,比如”性别“列,则每个Block几乎都会包含所有取值,导致BloomFilter索引失去意义。

注意事项:

1.不支持对Tinyint、Float、Double 类型的列建Bloom Filter索引。

2.Bloom Filter索引只对in和 = 过滤查询有加速效果。

3.如果要查看某个查询是否命中了Bloom Filter索引,可以通过查询的Profile信息查看

4.最后:

欢迎指正。

BloomFilter在Drois中的应用相关推荐

  1. HBase中Bloomfilter类型的设置及使用的理解

    1.Bloomfilter的原理?   可参考  http://hi.baidu.com/yizhizaitaobi/blog/item/cc1290a0a0cd69974610646f.html 2 ...

  2. 网络爬虫:URL去重策略之布隆过滤器(BloomFilter)的使用

    前言: 最近被网络爬虫中的去重策略所困扰.使用一些其他的"理想"的去重策略,不过在运行过程中总是会不太听话.不过当我发现了BloomFilter这个东西的时候,的确,这里是我目前找 ...

  3. HBase之BloomFilter

    HBase的Get/Scan操作流程   hbase中有BloomFilter的功能,可以在有些情况下过滤掉不需要的hfile,节省IO. BloomFilter作用 BloomFilter在HBas ...

  4. Scrayp-集成scrapy_redis和bloomfilter实现增量

    前言 (备注一下,我的开发环境不是Linux就是MacOSX,Windows很多写法不是这样的) 在爬取数据的过程中,有时候需要用到定时.增量爬取.定时这里暂且不说,先说增量爬取. 我想要的增量爬取目 ...

  5. 布隆过滤器(BloomFilter)原理 实现和性能测试

    目录 BloomFilter的原理 如何确定最优的m和k? guava中的BloomFilter 使用案例 和HashSet对比 测试环境 测试方式 BloomFilter vs HashSet 在不 ...

  6. Hbase 解析(四) 布隆过滤器(BloomFilter)

    1.简介 1.1 介绍 Bloom filter是1970年引入的一种数据结构,在过去的十年中,由于它为网络主机之间的组成员信息传输提供了带宽效率,因此被网络研究界采用.发送者将信息编码成一个比特向量 ...

  7. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  8. 面试官问:什么是布隆过滤器?

    布隆过滤器 布隆过滤器是一种由位数组和多个哈希函数组成概率数据结构,返回两种结果 可能存在 和 一定不存在. 布隆过滤器里的一个元素由多个状态值共同确定.位数组存储状态值,哈希函数计算状态值的位置. ...

  9. Scrapy-redis 源码分析 及 框架使用

    From:https://blog.csdn.net/weixin_37947156/article/details/75044971 From:https://cuiqingcai.com/6058 ...

最新文章

  1. MyBatis的使用
  2. linux下导入、导出mysql数据库命令
  3. 036、Linux下ipmitool命令
  4. java 语言概述(零)
  5. 60-172-010-使用-Broadcast-简介
  6. 获取来源网站php,js实现获取网站搜索来源代码
  7. Android中JNI编程出现“Invalid arguments ' Candidates are: void * malloc(?) '”的解决方案
  8. Python基础——timeit模块
  9. ML Case Studies(0)
  10. 用C/C++实现SMC动态代码加密技术 .
  11. EXPLAIN查看SQL执行计划
  12. 机械电钢琴音源 Cinesamples Keyboard In Blue Kontakt
  13. java劳务派遣信息管理系统servlet员工社保工资信息jsp源码mysql
  14. matlab imshow伪彩色,实验7:彩色图像及伪彩色处理
  15. torch.optim的一些方法
  16. MarkDown语法学习--字体,分割线,删除线,下划线
  17. 冯诺依曼 计算机名言,冯·诺依曼名言
  18. 前端监控:回放录制库 rrweb
  19. [jzoj 4246] 【五校联考6day2】san {spfa+dfs/spfa+拓扑排序+dp}
  20. 图扑 Web SCADA 零代码组态水泥生产工艺流程 HMI

热门文章

  1. 损失函数 - 交叉熵损失函数
  2. ffmpeg为视频添加特效
  3. 录制动画时AnimationClip.SetCurve的relativePath问题
  4. linux mp4转h264工具,Linux音视频开发之二:转换YUY2到I420便于压缩成h264
  5. 阿里云Redis开发规范学习总结
  6. matlab如何仿真递推型dft算法,递推dft算法
  7. 小波变换(DWT),短时傅里叶分析(STFT),与快速傅里叶(FFT)之间的关系
  8. 机器学习入门(浅谈L1和L2正则)
  9. 【转】流媒体技术笔记(视频编码相关)
  10. 基于JAVA的个人博客论坛系统的设计与实现参考【数据库设计、源码、开题报告】