布隆过滤器介绍及其在大数据场景的应用

news2025/5/18 16:15:03

目录

  • 布隆过滤器(Bloom Filter)介绍
    • 一、布隆过滤器的基本原理
      • 插入元素过程:
      • 查询元素过程:
    • 二、布隆过滤器的特点
    • 三、误判率计算
    • 四、举例说明
    • 五、总结
  • Python版的简单布隆过滤器实现示例
    • 一、简单布隆过滤器Python示例
    • 二、布隆过滤器在离线数仓和分析数据库中的应用场景
    • 三、具体应用说明
      • 1. 离线数仓(Hive、Spark、Hadoop)
      • 2. 实时分析数据库(Doris、ClickHouse)
    • 四、总结

布隆过滤器(Bloom Filter)介绍

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它的特点是:

  • 快速判断元素是否存在
  • 可能存在误判(假阳性),但不会漏判(假阴性)
  • 占用空间小,适合大规模数据去重、过滤

一、布隆过滤器的基本原理

布隆过滤器由一个长度为 m 的位数组(bit array)和 k 个独立的哈希函数组成。

插入元素过程:

  1. 对要插入的元素,使用这 k 个哈希函数分别计算出 k 个哈希值,这些哈希值对应位数组中的 k 个位置。
  2. 将这 k 个位置的位都设置为 1。

查询元素过程:

  1. 对查询元素,同样用这 k 个哈希函数计算出 k 个位置。
  2. 检查这 k 个位置的位是否全部为 1:
    • 全部为1:元素可能存在(存在假阳性)。
    • 有任意一位为0:元素一定不存在

二、布隆过滤器的特点

特性说明
空间效率远小于存储所有元素的集合,适合海量数据
查询速度非常快,时间复杂度为 O(k)
误判率存在假阳性(可能误判存在),但无假阴性
不支持删除传统布隆过滤器不支持删除元素(有变种支持)
适用场景大数据去重、缓存穿透过滤、网络黑名单检测等

三、误判率计算

假设:

  • 位数组长度为 m
  • 插入元素数量为 n
  • 使用哈希函数个数为 k

误判率(假阳性概率)大致为:

[
\left(1 - e^{-\frac{k n}{m}}\right)^k
]
在这里插入图片描述

  • 通过合理选择 mk,可以控制误判率在可接受范围。

四、举例说明

假设布隆过滤器位数组长度为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 bitarray

class 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.size
            self.bit_array[digest] = 1

    def check(self, item):
        for i in range(self.hash_count):
            digest = mmh3.hash(item, i) % self.size
            if 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性能,降低资源消耗。
  • 实时分析数据库中,布隆过滤器帮助实现高效的实时去重和查询加速
  • 需要注意的是,布隆过滤器存在一定误判率,适合容忍少量误差的场景。

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

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

相关文章

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…

回溯法理论基础 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创建的子进程,会继承父进程的代码和数据,因此本质上还是在执行父进程的代码 进程替换可以将…

JavaScript 的编译与执行原理

文章目录 前言🧠 一、JavaScript 编译与执行过程1. 编译阶段(发生在代码执行前)✅ 1.1 词法分析(Lexical Analysis)✅ 1.2 语法分析(Parsing)✅ 1.3 语义分析与生成执行上下文 🧰 二…

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…

车载以太网驱动智能化:域控架构设计与开发实践

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

如何利用技术手段提升小学数学练习效率

在日常辅导孩子数学作业的过程中,我发现了一款比较实用的练习题生成工具。这个工具的安装包仅1.8MB大小,但基本能满足小学阶段的数学练习需求。 主要功能特点: 参数化出题 可自由设置数字范围(如10以内、100以内) 支…

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…

双向长短期记忆网络-BiLSTM

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

MySQL UPDATE 执行流程全解析

引言 当你在 MySQL 中执行一条 UPDATE 语句时,背后隐藏着一套精密的协作机制。从解析器到存储引擎,从锁管理到 WAL 日志,每个环节都直接影响数据一致性和性能。 本文将通过 Mermaid 流程图 和 时序图,完整还原 UPDATE 语句的执行…

亚马逊云科技:开启数字化转型的无限可能

在数字技术蓬勃发展的今天,云计算早已突破单纯技术工具的范畴,成为驱动企业创新、引领行业变革的核心力量。亚马逊云科技凭借前瞻性的战略布局与持续的技术深耕,在全球云计算领域树立起行业标杆,为企业和个人用户提供全方位、高品…

【实测有效】Edge浏览器打开部分pdf文件显示空白

问题现象 Edge浏览器打开部分pdf文件显示空白或显示异常。 ​​​​​​​ ​​​​​​​ ​​​​​​​ 问题原因 部分pdf文件与edge浏览器存在兼容性问题,打开显示异常。 解决办法 法1:修改edge配置 打开edge浏览器&#x…

RJ连接器的未来:它还会是网络连接的主流标准吗?

RJ连接器作为以太网接口的代表,自20世纪以来在计算机网络、通信设备、安防系统等领域中占据了核心地位。以RJ45为代表的RJ连接器,凭借其结构稳定、信号传输可靠、成本低廉等优势,在有线网络布线领域被广泛采用。然而,在无线网络不…

Redis持久化机制详解:保障数据安全的关键策略

在现代应用开发中,Redis作为高性能的内存数据库被广泛使用。然而,内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制,包括RDB、AOF以及混合持久化模式,帮助开发者根据业务需求选择最适合的持…

DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案

DeepSeek 作为当前最热门的开源大模型之一,其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中,无论是本地运行还是云端服务,用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题,提…