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)