對使用者日誌資料標記使用者是新使用者還是老使用者
由於使用者量比較大,直接根據使用者賬號去匹配歷史出現的使用者,需要的記憶體比較大。此處使用布隆過濾器解決
布隆過濾器是一種以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 是一種空間效率很高的隨機...