布隆过滤器(做筛选器索引)

什么是布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中

它的优点是空间效率和查询时间都比一般的算法要好的多缺点是有一定的误识别率和删除困难

上面这句介绍比较全面的描述了什么是布隆过滤器,如果还是不太好理解的话:就可以把布隆过滤器理解为一个set集合,我们可以通过add往里面添加元素,通过contains来判断是否包含某个元素。

布隆过滤器的优缺点

布隆过滤器的优点:

  • 时间复杂度低,增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)
  • 保密性强,布隆过滤器不存储元素本身
  • 存储空间小,如果允许存在一定的误判,布隆过滤器是非常节省空间的(相比其他数据结构如Set集合)

布隆过滤器的缺点:

  • 有点一定的误判率,但是可以通过调整参数来降低
  • 无法获取元素本身
  • 很难删除元素

用布隆过滤器干什么(重要)

 Bloom 筛选器索引加速进行“大海捞针式”查询。

作为大数据开发我经常需要“大海捞针式”查询我需要的字段,举个例子:

我的数据是 id, date, loctionId, data(其他很多列),默认情况它就先找分区,再全表搜索到底有没有( id, date, loctionId)

如果我基于id, date, loctionid建立一个bloom索引,首先通过布隆过滤器知道有没有( id, date, loctionId),如果在索引里没有,那我就不需要搜索相关的id,节省大量搜索时间。

布隆过滤器原理

把每个key hash之后映射到位图上,位图默认为0,映射到则改为1。

查询就是key hash之后看看位图是不是都是1,如果有一个不是1是0,则这key一定没有

两个key取模,hash后可能hash碰撞, 导致存储的位图一样,如下图所示,xushu跟xushu666存储在bloom的位图都一样,所在存在不一定存在,所以bloom过滤器有一点误差。

不存在一定不存在,存在不一定存在

记住上面这句话,我只要能排除不存在的id,那我就可以减少很多查询时间。

基于误差我可以通过下面两种方式减小误差。

bit位数越长,我hash之后放入同一个位数概率越低,冲突概率越低。

一次hash之后可能冲突,那我对一个key多次hash, 多放几个位数,这样冲突概率也会降低,但是hash太多次也会影响查询效率,因为查询的的时候也需要多次hash

基于detlaTable建bloom过滤器实践

背景基于databricks(spark),可参考思路

// Enable the Bloom filter index capability
SET spark.databricks.io.skipping.bloomFilter.enabled = true;
// 数据源加载到detlaTable
from delta.tables import DeltaTable

# 加载 Delta Lake 表
delta_table = DeltaTable.forPath(spark, "/path/to/delta-table")

# 创建布隆过滤器索引
# FPP 为 10% 时,每个元素需要 5 位,也就是一个key需要hash 5次,存到五个位图
# numItems=50000000 表示期望布隆过滤器包含的唯一元素数量为 5000 万
delta_table.createIndex("bloom_filter_index", "id, date, locationId", "bloom_filter(fpp=0.1, numItems=50000000)")

# 查看创建的索引信息
delta_table.describeIndex("bloom_filter_index").show()

使用bloom过滤器效能(databricks官方测试)

1.5GB数据使用bloom作索引后查询速度 (21s ===> 13s)

----------------------> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】初识二叉搜索树(Binary Search Tree)

文章目录 1. 二叉搜索树的概念2. 二叉搜索树的操作1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它可能是一棵空树,也可能是具有以下性质的二叉树: 若它的左子树不为空&am…

构造方法/构造器

1、构造器的介绍 2、构造器的快速入门 3、 注意事项和使用细节 4、 javap的使用----反编译

封装的echarts子组件使用watch监听option失效的问题

项目场景: 我在项目里面封装了一个echarts组件,组件接收一个来自外部的option,然后我用了一个watch函数去监听这个option的变化,option变化之后,销毁,然后再新建一个charts表 碎碎念 问题如标题所示,这篇…

每日面经03

1.String一些方法? 答:length()方法是获取字符串长度,charAt(int index)是返回指定索引的字符,equals(Object anther)比较两个字符串的内容是否完全相同,compareTo(String s)按照字典顺序比较两个字符串,相…

vscode使用remote-ssh免密连接服务器

你还在使用XShell、Hyper、FinalShell等等SSH客户端软件吗,作为前端的我们,一直在用的功能强大的开发工具vscode,早已实现SSH连接功能(借助官方提供的插件)。而且更加好用,可以直接打开服务器上的文件&…

如何在Linux使用docker安装Plik并实现无公网ip上传下载内网存储的文件资源

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&…

内网穿透的应用-如何在Linux系统Docker安装JSON Crack并实现远程访问本地数据

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序,能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

javaEE5(javascript/jquery附加作业(选做))

在网页结尾嵌入一段javascript/jquery代码,作用:将网页中所有粗体字(strong标签包裹的文字)以链接方式提取出来作为提纲,放到页面右上角,点击它,文章定位到相应位置(附件两个文件可作…

LoadBalancer负载均衡服务调用

LoadBalancer负载均衡服务调用 1、Ribbon目前也进入维护 ​ Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。 ​ 简单的说,Ribbon是Netflix发布的开源项目,主要功能是**提供客户端的软件负载均衡算法和服务调用。**Ribbon…

Python安装第三方库

前言:大部分时候我们都是使用pip install去安装一些第三方库,但是偶尔也会有部分库无法安装(最典型的就是dlib这个库),需要采取别的方法解决,这里做笔记记录一下。 使用国内镜像源安装 因为pypi的服务器在…

集群软件部署

目录 软件部署集群软件前置环境网络配置ssh配置 JDK环境防火墙和SELinux制作快照 scp(ssh cp)ZooKeeper介绍安装 Hadoop介绍Hadoop集群角色角色和节点分配安装内存调整Hadoop集群安装 报错分析结果 Spark介绍下载安装 软件部署 包含zookeeper、Hadoop、spark的安装…

【Redis】redis持久化

redis 持久化 Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之…

nginx的使用,homebrew安装及使用nginx。

Nginx 是一个高性能的 HTTP 和反向代理服务器,它提供了诸如 IMAP、POP3 和 SMTP 等邮件代理服务。以下是 Nginx 的主要作用:12345 作为 Web 服务器。Nginx 能够以较少的系统资源提供高效率的服务,尤其在高并发连接下表现出色。1…

【java数据结构】HashMap和HashSet

目录 一.认识哈希表: 1.1什么是哈希表? 1.2哈希表的表示: 1.3常见哈希函数: 二.认识HashMap和HashSet: 2.1关于Map.Entry的说明:,> 2.2Map常用方法说明: 2.3HashMap的使用案例: 2.4Set常见方法…

图机器学习(1)--导论

0 引入 斯坦福大学CS224W图机器学习公开课-同济子豪兄中文精讲:https://github.com/TommyZihao/zihao_course/tree/main/CS224W 为什么是图?图是描述关联数据的通用语言。 前期的研究:节点之间独立同分布,没有关系。 图&#x…

解决input事件监听拼音输入法导致高频事件

1、业务场景 在文本框中输入内容,执行查询接口,但遇到一个问题,当用拼音打字写汉字去搜索的时候,会输入一些字母拼成汉字,怎么能监听等拼音文字输入完成后再触发文本框监听事件 2、解决方案 通过查阅资料得知在输入中…

【C++ Primer Plus学习记录】简单文件输入/输出

有时候,通过键盘输入并非最好的选择。例如,假设您编写了一个股票分析程序,并下载了一个文件,其中包含1000种股票的价格。在这种情况下,让程序直接读取文件,而不是手工输入文件中所有的值,将方便…

2024大广赛Canva可画都有哪些命题?

大广赛官网在3月8日发布了2024年Canva可画的命题,Canva可画是全球领先的视觉传播平台,2013年诞生于悉尼,2018年进入中国市场。秉承“赋予世界设计的力量”的使命,Canva可画为用户提供零门槛的设计编辑工具(网页端/App/小程序)&…

矢量图片转换软件Vector Magic mac中文版功能特色

Vector Magic mac中文版是一款非常流行的矢量图片转换软件,它的功能特色主要体现在以下几个方面: 首先,Vector Magic mac中文版拥有出色的矢量转换能力。它采用世界上最好的全彩色自动描摹器,能够将JPG、PNG、BMP和GIF等位图图像…

【C语言程序设计】C语言求圆周率π(三种方法)

题目一&#xff1a; 利用公式①计求π的近似值&#xff0c;要求累加到最后一项小于10^(-6)为止。 程序代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){float s1;float pi0;float i1.0;float n1.0;while(fabs(i)&…