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

news2024/11/27 0:29:28

什么是布隆过滤器

布隆过滤器(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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习vue3第四节(ref以及ref相关api)

主要记录以下api:ref()、isRef()、unref()、 shallowRef()、triggerRef()、customRef() 1、ref() 定义 接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value,.value属性用于追踪并且存…

I2C驱动AT24C02

文章目录 一、硬件电路设备地址 二、使用步骤字节写:页写入:任意写:任意读: 一、硬件电路 设备地址 设备需要一个8位的设备地址字,后面跟着一个启动条件,以使芯片能够进行读或写操作 设备地址字由一个强制的1,0序列的前四个最有效的位,如所示…

简单使用国产数据库—达梦

达梦数据库是一款由中国的达梦软件公司开发的关系数据库管理系统(RDBMS),它在业界以其高性能、可扩展性和安全性而著称。该系统广泛应用于各种应用程序的数据存储和管理,满足用户对于数据处理和管理的多样化需求。 安装好的达梦数…

容联云孙昌勋:聚焦“营销服”数智化转型,构筑金融业增长引擎

在每日经济新闻2024全国两会特别报道中,容联云创始人兼CEO孙昌勋针对“人工智能”在具体行业如何开展时表示:“随着泛金融行业用户渠道与体验发生变化,金融业对营销、销售、服务等场景的数智化改造有巨大的需求,人工智能等科技投入…

Qt/QML编程之路:openglwidget和倒车影像的切换(43)

关于如何实现一个基于OpenGL的3d 图形,这个有很多专门的介绍,我在开发中遇到了这么一个问题: 如何实现一个倒车影像的video显示与一个3D物体显示的切换,因为开窗在同样的一个位置,如果车子倒车启动,则需要将原本显示3D的地方切换为视频图像的显示。 class testOpenGl : …

docker容器镜像管理+compose容器编排(持续更新中)

目录 一、 Docker的基本组成 二、 容器和镜像的关系 2.1 面向对象角度 2.2 从镜像容器角度 三、 容器命令 3.1 使用Ubuntu 3.1.1 下载镜像 3.1.2 新建和启动容器 run 3.1.3交互式 compose编排与部署 1. docker-compose部署 2. docker-compose.yml模板 …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)

提供外部应用组件嵌入式显示功能,即外部应用提供的UI可在本应用内显示。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…

2.4 关系代数 数据库系统概论

目录 2.4.1 传统的集合运算 (二目运算) (1) 并(Union) (2)差(Except) (3) 交(Intersection) &#xff08…

wait 和 notify方法

目录 1.1 wait()方法 wait 做的事情: wait 结束等待的条件: 1.2 notify()方法 1.3notifyAll方法 1.4wait()和sleep()对比 由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序. 完成这个协调…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件,要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件,则需要经过用户同意,这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

Promise图解,Pass

10-优化代码_哔哩哔哩_bilibili

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹

STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件新增工程文件夹前言第1章 添加文件夹第2章 添加文件路径2.1 相对路径方法2.2 绝对路径方法 总结 前言 在编程的过程中,如果需要在原有的工程基础上新增其它的…

【Java从入门到精通】Java数组

数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素。 你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number0&#xff0…

数据结构和算法:复杂度分析

算法效率评估 时间效率:算法运行速度的快慢。 空间效率:算法占用内存空间的大小。 效率评估方法主要分为两种:实际测试、理论估算 实际测试问题: 1.难以排除测试环境的干扰因素。 硬件配置会影响算法的性能。需要在各种机器上进…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪,大胜呼延灼。呼延灼损失了很多人马,不敢回京,一个人去青州找慕容知府。一天在路上住店,马被桃花山的人偷走了,于是到了青州,带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

vivado 使用Design Runs窗口、

使用Design Runs窗口 “设计运行”窗口显示在项目中创建的所有合成和实现运行。它包括用于配置、管理和启动运行的命令。 打开Design Run窗口 选择窗口 →  Design Runs打开“Design Runs”窗口。 设计运行窗口功能 •每个实现运行都缩进显示在其子级的合成运行下面。 …

[Java、Android面试]_01_多线程: 重要参数、状态、优雅停止线程等

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏关注, 现分享如下: 文章目录 1. 线程池重要参数2. 线程池状态3. 优雅停止线程4. 线…

【Qt学习笔记】(二)--第一个程序“Hello World”(学习Qt中程序的运行、发布、编译过程)

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    因为我个人对Qt也是有一些需求,所以开设本专栏进行学习,希望大家可以一起学习,共同进步。   这篇博客将从一个 He…

HTML 学习笔记(十一)表单

一、分块 1.单行文本框控件–文本框和密码框 文本框控件通过单标签input实现,其具有必要属性type来控制输入控件的类型(默认为text即文本信息),密码框的type为password(口令)。   表单的动作属性定义了目的文件的文件名。由动作属性定义的这个文件通常…

Qt QDateTime类使用

一.Qt datetime 介绍 Qt中的QDateTime类是用于处理日期和时间的组合的类,它提供了丰富的功能来操作和格式化日期时间数据。以下是其主要特点和用法: 构造函数:QDateTime可以通过组合QDate(日期)和QTime(时…