spark 过滤大批量数据 BloomFilter

本文介绍了Bloom Filter,它是空间效率高的随机数据结构,通过K个Hash函数将元素映射到位阵列。检索时看点是否为1判断元素是否在集合,可能存在误判,不适合零错误场景,但能在低错误率场景节省存储空间,还提及了其创建实例的静态方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.BloomFilter介绍

 Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思想。

    但Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省,Bloom Filter不包含则一定不包含 ,包含则可能不包含(错误率极低)

2.代码实例

 BloomFilter提供了create静态方法来创建BloomFilter实例 

//第一个参数 为倒入数据类型   第二个为大概数据条数 
val bloomFilter = BloomFilter.create(Funnels.stringFunnel, 100000000, 0.0001)
sc.textFile("/hive_data/test")
  .map(line => {
    val arr = line.split("\t", -1)
    arr
  })
  .filter(arr => {
    arr(1).equals("居住地")
  })
  .map(arr => {
    (arr(0), 1)
  })

  .reduceByKey(_ + _)
  .collect()
  .foreach(kv => {
    bloomFilter.put(kv._1)
  })


val bro_beijing = sc.broadcast(
  bloomFilter
)

 

sc.textFile(testpath)
  .map(_.split("\t"))
  .filter(arr => {
    arr.length >= 9 && !bro_beijing.value.mightContain(arr(0)) 
  })
  .map(arr => {
    (arr(0), 1)
  })
  .reduceByKey(_ + _)
  .map(_._1)
  .saveAsTextFile(savePath)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值