布隆过滤器介绍及其在大数据场景的应用
目录
- 布隆过滤器(Bloom Filter)介绍
- 一、布隆过滤器的基本原理
- 插入元素过程:
- 查询元素过程:
- 二、布隆过滤器的特点
- 三、误判率计算
- 四、举例说明
- 五、总结
- Python版的简单布隆过滤器实现示例
- 一、简单布隆过滤器Python示例
- 二、布隆过滤器在离线数仓和分析数据库中的应用场景
- 三、具体应用说明
- 1. 离线数仓(Hive、Spark、Hadoop)
- 2. 实时分析数据库(Doris、ClickHouse)
- 四、总结
布隆过滤器(Bloom Filter)介绍
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它的特点是:
- 快速判断元素是否存在
- 可能存在误判(假阳性),但不会漏判(假阴性)
- 占用空间小,适合大规模数据去重、过滤
一、布隆过滤器的基本原理
布隆过滤器由一个长度为 m 的位数组(bit array)和 k 个独立的哈希函数组成。
插入元素过程:
- 对要插入的元素,使用这 k 个哈希函数分别计算出 k 个哈希值,这些哈希值对应位数组中的 k 个位置。
- 将这 k 个位置的位都设置为 1。
查询元素过程:
- 对查询元素,同样用这 k 个哈希函数计算出 k 个位置。
- 检查这 k 个位置的位是否全部为 1:
- 全部为1:元素可能存在(存在假阳性)。
- 有任意一位为0:元素一定不存在。
二、布隆过滤器的特点
特性 | 说明 |
---|---|
空间效率 | 远小于存储所有元素的集合,适合海量数据 |
查询速度 | 非常快,时间复杂度为 O(k) |
误判率 | 存在假阳性(可能误判存在),但无假阴性 |
不支持删除 | 传统布隆过滤器不支持删除元素(有变种支持) |
适用场景 | 大数据去重、缓存穿透过滤、网络黑名单检测等 |
三、误判率计算
假设:
- 位数组长度为 m
- 插入元素数量为 n
- 使用哈希函数个数为 k
误判率(假阳性概率)大致为:
[
\left(1 - e^{-\frac{k n}{m}}\right)^k
]
- 通过合理选择 m 和 k,可以控制误判率在可接受范围。
四、举例说明
假设布隆过滤器位数组长度为10位(初始全为0),有2个哈希函数:
- 插入元素“A”:哈希函数分别映射到位置2和5,将这两位设为1。
- 查询元素“B”:哈希函数映射到位置2和7,位置7为0,说明“B”一定不在集合中。
- 查询元素“A”:位置2和5都为1,说明“A”可能存在。
五、总结
布隆过滤器是一种用空间换时间的高效数据结构,适合快速判断元素是否存在于大规模集合中,缺点是存在一定误判率,且传统版本不支持删除。
Python版的简单布隆过滤器实现示例
一、简单布隆过滤器Python示例
import mmh3 # MurmurHash哈希库,安装:pip install mmh3
from bitarray import bitarray # 位数组库,安装:pip install bitarrayclass BloomFilter:def __init__(self, size=1000, hash_count=3):self.size = size # 位数组大小self.hash_count = hash_count # 哈希函数个数self.bit_array = bitarray(size)self.bit_array.setall(0)def add(self, item):for i in range(self.hash_count):# 计算哈希值并映射到位数组索引digest = mmh3.hash(item, i) % self.sizeself.bit_array[digest] = 1def check(self, item):for i in range(self.hash_count):digest = mmh3.hash(item, i) % self.sizeif self.bit_array[digest] == 0:return False # 一定不存在return True # 可能存在# 使用示例
bf = BloomFilter(size=5000, hash_count=5)
bf.add("user_123")
print(bf.check("user_123")) # True,可能存在
print(bf.check("user_456")) # False,一定不存在
二、布隆过滤器在离线数仓和分析数据库中的应用场景
系统 | 应用场景示例 |
---|---|
Hive | - 大规模数据去重,快速过滤已处理过的用户ID - 预过滤数据,减少Join数据量,提高查询性能 |
Spark | - 大数据实时去重,避免重复计算 - 结合广播变量,做大表过滤小表的快速过滤器 |
Hadoop | - MapReduce作业中,提前过滤无效数据,减少Shuffle和计算开销 |
Doris | - 实时分析中快速判断某条记录是否已存在,避免重复写入 - 结合索引优化查询性能 |
ClickHouse | - 近实时去重,尤其在流式数据入库前做过滤 - 结合物化视图做高效去重统计 |
三、具体应用说明
1. 离线数仓(Hive、Spark、Hadoop)
-
去重过滤
在大数据离线处理时,数据量巨大,传统的distinct
操作性能差且资源消耗大。布隆过滤器可以先快速过滤掉大量重复数据,减少后续计算压力。 -
Join优化
通过布隆过滤器预先过滤掉不匹配的Key,减少Shuffle数据量,提高Join效率。 -
缓存穿透防护
在数据预处理阶段,过滤掉不在目标集合中的数据,避免无效计算。
2. 实时分析数据库(Doris、ClickHouse)
-
实时去重
流式数据入库时,用布隆过滤器判断是否已存在,避免重复写入,提高数据质量。 -
索引加速
结合布隆过滤器做索引预过滤,快速排除不匹配数据,提升查询响应速度。 -
物化视图和预聚合
在物化视图构建阶段,利用布隆过滤器快速判断是否需要更新,减少资源消耗。
四、总结
- 布隆过滤器是一种高效的概率型数据结构,适合大规模数据去重和快速判断元素存在性。
- 在离线数仓中,布隆过滤器能显著提升去重和Join性能,降低资源消耗。
- 在实时分析数据库中,布隆过滤器帮助实现高效的实时去重和查询加速。
- 需要注意的是,布隆过滤器存在一定误判率,适合容忍少量误差的场景。
相关文章:

布隆过滤器介绍及其在大数据场景的应用
目录 布隆过滤器(Bloom Filter)介绍一、布隆过滤器的基本原理插入元素过程:查询元素过程: 二、布隆过滤器的特点三、误判率计算四、举例说明五、总结 Python版的简单布隆过滤器实现示例一、简单布隆过滤器Python示例二、布隆过滤器…...
Ansys 计算刚柔耦合矩阵系数
Ansys 计算刚柔耦合系数矩阵 文章目录 Ansys 计算刚柔耦合系数矩阵卫星的刚柔耦合动力学模型采用 ANSYS 的 APDL 语言的计算方法系统转动惯量的求解方法参考文献 卫星的刚柔耦合动力学模型 柔性航天器的刚柔耦合动力学模型可以表示为 m v ˙ B t r a n η F J ω ˙ ω J…...
微服务八股(自用)
微服务 SpringCloud 注册中心:Eureka 负载均衡:Ribbon 远程调用:Feign 服务熔断:Hystrix 网关:Gateway/Zuul Alibaba 配置中心:Nacos 负载均衡:Ribbon 服务调用:Feign 服务…...
指定elf文件dwarf 版本以及查看dwarf版本号
背景: 在实际项目开发过程中,为了让低版本的CANape 工具识别elf 文件,需要在编译elf文件时,指定dwarf的版本。 使用方法: 需要再CMakeLists.txt中指定dwarf 版本 add_compile_options(-g -gdwarf-2) #-gdwarf-4 验…...

Fidder基本操作
1.抓取https请求 Fidder默认不能抓取https请求,我们必须通过相应的设置才能抓取https请求 1.选择tools下的option 2.选择https选项,并且勾选下面的选项 3.点击Actions导出信任证书到桌面(expert root certificate to desktop) 4.在浏览器中添加对应的证…...

项目管理进阶:精读 78页华为项目管理高级培训教材【附全文阅读】
本文概述了华为项目管理(高级)课程的学习目标及学习方法。学习该课程后,学员应能: 1. **深刻理解项目管理**:掌握项目管理的基本概念与方法,构建项目管理思维框架。 2. **应用IBEST理念**:结合I…...

[Java] 方法和数组
目录 1. 方法 1.2 什么是方法 1.2 方法的定义 1.3 方法的调用 1.4 方法的重载 1.5 递归 2. 一维数组 2.1 什么是数组 2.2 数组的创建 2.3 数组的初始化 2.4 遍历数组 2.5 引用数据类型 2.6 关于null 2.7 数组转字符串 2.8 数组元素的查找 2.9 数组的排序 2.10…...

微软家各种copilot的AI产品:Github copilot、Microsoft copilot
背景 大家可能听到很多copilot,比如 Github Copilot,Microsoft Copilot、Microsoft 365 Copilot,有什么区别 Github Copilot:有网页版、有插件(idea、vscode等的插件),都是面向于程序员的。Mi…...
KL散度 (Kullback-Leibler Divergence)
KL散度,也称为相对熵 (Relative Entropy),是信息论中一个核心概念,用于衡量两个概率分布之间的差异。给定两个概率分布 P ( x ) P(x) P(x) 和 Q ( x ) Q(x) Q(x)(对于离散随机变量)或 p ( x ) p(x) p(x) 和 q ( x …...
深入解析:java.sql.SQLException: No operations allowed after statement closed 报错
在 Java 应用程序开发过程中,尤其是涉及数据库交互时,开发者常常会遇到各种各样的异常。其中,java.sql.SQLException: No operations allowed after statement closed是一个较为常见且容易令人困惑的错误。本文将深入剖析这一报错,…...
DAY 23 训练
DAY 23 训练 DAY23 机器学习管道 pipeline基础概念转换器(Transformer)估计器(Estimator) 管道(Pipeline)代码演示没有 pipeline 的代码pipeline 的代码教学导入库和数据加载分离特征和标签,划分…...
wordcount程序
### 在 IntelliJ IDEA 中编写和运行 Spark WordCount 程序 要使用 IntelliJ IDEA 编写并运行 Spark 的 WordCount 程序,需按照以下流程逐步完成环境配置、代码编写以及任务提交。 --- #### 1. **安装与配置 IntelliJ IDEA** 确保已正确安装 IntelliJ IDEA&#x…...

回溯法理论基础 LeetCode 77. 组合 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合
目录 回溯法理论基础 回溯法 回溯法的效率 用回溯法解决的问题 如何理解回溯法 回溯法模板 LeetCode 77. 组合 回溯算法的剪枝操作 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合 回溯法理论基础 回溯法 回溯法也可以叫做回溯搜索法,它是一…...

【进程控制二】进程替换和bash解释器
【进程控制二】进程替换 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2总结 4.实现一个bash解释器4.1内建命令 通过fork创建的子进程,会继承父进程的代码和数据,因此本质上还是在执行父进程的代码 进程替换可以将…...
线性回归策略
一种基于ATR(平均真实范围)、线性回归和布林带的交易策略。以下是对该策略的全面总结和分析: 交易逻辑思路 1. 过滤条件: - 集合竞价过滤:在每个交易日的开盘阶段,过滤掉集合竞价产生的异常数据。 - 价格异常过滤:排除当天开盘价与最高价或最低价相同的情况,这…...
Linux下的c/c++开发之操作Redis数据库
C/C 操作 Redis 的常用库 在 C/C 开发中操作 Redis 有多种方式,最主流的选择是使用第三方客户端库。由于 Redis 官方本身是使用 C 编写的,提供的 API 非常适合 C/C 调用。常见的 Redis C/C 客户端库包括: hiredis:官方推荐的轻量…...
Bitmap、Roaring Bitmap、HyperLogLog对比介绍
一、Bitmap(位图)概述 Bitmap 是一种用位(bit)来表示集合元素是否存在的数据结构。每个位代表一个元素的状态(0或1),非常节省空间且支持快速集合操作。 常见Bitmap类型: 普通Bitmap 最简单的位数组,适合元素范围固定且不稀疏的场景。例如,元素范围是0~1000,用1001…...

JavaScript 的编译与执行原理
文章目录 前言🧠 一、JavaScript 编译与执行过程1. 编译阶段(发生在代码执行前)✅ 1.1 词法分析(Lexical Analysis)✅ 1.2 语法分析(Parsing)✅ 1.3 语义分析与生成执行上下文 🧰 二…...
fastapi项目中数据流转架构设计规范
一、数据库层设计 1.1 ORM模型定义 class SysUser(Base):__table_args__ {"mysql_engine": "InnoDB","comment": "用户表"}id: Mapped[int] mapped_column(Integer, primary_keyTrue, autoincrementTrue, comment"用户ID&quo…...

NHANES指标推荐:FMI
文章题目:Exploring the relationship between fat mass index and metabolic syndrome among cancer patients in the U.S: An NHANES analysis DOI:10.1038/s41598-025-90792-9 中文标题:探索美国癌症患者脂肪量指数与代谢综合征之间的关系…...

【JDBC】JDBC常见错误处理方法及驱动的加载
MySQL8中数据库连接的四个参数有两个发生了变化 String driver "com.mysql.cj.jdbc.Driver"; String url "jdbc:mysql://127.0.0.1:3306/mydb?useSSLfalse&useUnicodetrue&characterEncodingutf8&serverTimezoneAsia/Shanghai"; 或者Strin…...
React中useState中更新是同步的还是异步的?
文章目录 前言一、useState 的基本用法二、useState 的更新机制1. 内部状态管理2. 状态初始化3. 状态更新 三、useState 的更新频率与异步行为1. 异步更新与批量更新2. 为什么需要异步更新? 四、如何正确处理 useState 的更新1. 使用回调函数形式的更新2. 理解异步更…...
Vim编辑器命令模式操作指南
Vim 的命令模式(即 Normal 模式)是 Vim 的核心操作模式,用于执行文本编辑、导航、搜索、保存等操作。以下是命令模式下的常用操作总结: 1. 模式切换 进入命令模式:在任何模式下按 Esc 键(可能需要多次按&a…...

车载以太网驱动智能化:域控架构设计与开发实践
title: 车载以太网驱动专用车智能化:域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言:专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…...

如何利用技术手段提升小学数学练习效率
在日常辅导孩子数学作业的过程中,我发现了一款比较实用的练习题生成工具。这个工具的安装包仅1.8MB大小,但基本能满足小学阶段的数学练习需求。 主要功能特点: 参数化出题 可自由设置数字范围(如10以内、100以内) 支…...
C# DataGrid功能总览
目录 前言一、DataGrid基础功能1.DataGrid基础属性2.DataGridTextColumn属性3.DataGridTemplateColumn属性4.表DataGrid点击单元格或行时弹出两个按钮 二、其他功能1.表行DataGrid出现斑马纹效果2.表行DataGrid字体、行背景标红 前言 最近所实现的功能里,表DataGri…...

BGP路由策略 基础实验
要求: 1.使用Preva1策略,确保R4通过R2到达192.168.10.0/24 2.用AS_Path策略,确保R4通过R3到达192.168.11.0/24 3.配置MED策略,确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略,确保R1通过R2到达192.168.1.0/24 …...

第9讲、深入理解Scaled Dot-Product Attention
Scaled Dot-Product Attention是Transformer架构的核心组件,也是现代深度学习中最重要的注意力机制之一。本文将从原理、实现和应用三个方面深入剖析这一机制。 1. 基本原理 Scaled Dot-Product Attention的本质是一种加权求和机制,通过计算查询(Query…...
2025B难题练习
1.启动多任务排序 拓扑排序 每次选入度为0的点 对每次选的点进行排序 package mainimport ("bufio""fmt""os""slices""strings" )func main() {scanner : bufio.NewScanner(os.Stdin)scanner.Scan()text : scanner.Text()…...

双向长短期记忆网络-BiLSTM
5月14日复盘 二、BiLSTM 1. 概述 双向长短期记忆网络(Bi-directional Long Short-Term Memory,BiLSTM)是一种扩展自长短期记忆网络(LSTM)的结构,旨在解决传统 LSTM 模型只能考虑到过去信息的问题。BiLST…...