使用大型数据集在Spark上训练BloomFilter



我正在尝试为数据帧中的大量字符串创建一个布隆过滤器 - ~1.2 亿。平均每个字符串 20-25 个字符,总数据大小超过了我们默认的 1GBspark.driver.maxResultSize。我不想更改maxResultSize因为将来输入数据的大小增加时,我将不得不再次更改它。

Spark 中有什么方法可以将数据帧中的数据分成小块流式传输并通过调用BloomFilter.putString()来训练 BloomFilter ?我也尝试使用Dataset.toLocalIterator()但由于源数据集的性质,我不得不将其合并为 100 个大分区,使这 100 个分区中的每一个都太大而无法容纳驱动程序内存。

作为最后的手段,我正在考虑将数据收集到HDFS文件中并使用DFSInputStream读取它,但如果Spark中内置了一些东西,我想避免它。

SparkDataFrameStatFunctions提供bloomFilter实现:

val df = Seq(1, 3, 7, 21).toDF("id")
val bf  = df.stat.bloomFilter("id", expectedNumItems=1000, fpp=0.001)
scala> bf.mightContain(1)
res1: Boolean = true
scala> bf.mightContain(4)
res2: Boolean = false

最新更新