專案問題 布隆過濾器與kyro序列化

2021-10-24 09:07:46 字數 1558 閱讀 3520

對使用者日誌資料標記使用者是新使用者還是老使用者

由於使用者量比較大,直接根據使用者賬號去匹配歷史出現的使用者,需要的記憶體比較大。此處使用布隆過濾器解決

布隆過濾器是一種以bitmap集合為基礎的排重演算法,用來判斷乙個字串是否存在於乙個集合中(有一定的誤判率,有可能出現不存在判斷成存在),占用記憶體較小

測試**:

import org.apache.hadoop.util.bloom.

import org.apache.hadoop.util.hash.hash

object bloomfiltertest

}

正式**:

import org.apache.hadoop.util.bloom.

import org.apache.spark.sparkconf

import org.apache.spark.sql.sparksession

object sparkbloomfilter

// 廣播

val bc = spark.sparkcontext.broadcast(filter)

// 處理當天日誌,標記新老訪客

val log = spark.createdataset(seq("deviceid_01", "deviceid_05", "deviceid_15", "deviceid_25", "deviceid_16"))

val res = log.map(s=>).todf("device_id","isnew")

res.show(100,false)

spark.close()

}}

執行後報錯:

布隆過濾器未序列化

此處使用kryo序列化

解決**:conf設定kryo序列化

val conf = new sparkconf()

// 如果不設定,那麼spark預設使用jdk的序列化器(objectoutputstream,而這個類對被序列化的物件要求實現serializable標記介面)

conf.set("spark.serializer","org.apache.spark.serializer.kryoserializer")

// 如果顯式註冊了需要用kryo序列化的型別,那麼kryo在序列化物件時,不需要為每個物件都帶上類的元資訊,效率更高

conf.registerkryoclasses(array(classof[bloomfilter]))

布隆過濾器誤判率計算公式

布隆過濾器參考鏈結

布隆過濾器

布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...

布隆過濾器

布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...

布隆過濾器

如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...