使用大数据集在spark上训练bloomfilter

5uzkadbs  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(521)

我试图为Dataframe中的大量字符串创建一个bloom过滤器-~1.2亿。在平均每个字符串20-25个字符的情况下,总数据大小超过了我们的默认值 spark.driver.maxResultSize 1gb的。我不想改变现状 maxResultSize 因为当将来输入数据的大小增加时,我必须再次更改它。
在spark中有没有什么方法可以将Dataframe中的数据流化成小块,并通过调用 BloomFilter.putString() ? 我也试过用 Dataset.toLocalIterator() 但是由于源数据集的性质,我不得不将它合并到100个大分区中,使得这100个分区中的每个分区都太大,无法放入驱动程序内存。
作为最后的手段,我正在考虑将数据收集到hdfs文件中,并使用dfsinputstream读取它,但如果spark中内置了某些内容,我希望避免使用它。

avwztpqn

avwztpqn1#

Spark DataFrameStatFunctions 提供 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

相关问题