我正在尝试为数据帧中的大量字符串创建布隆过滤器 - 约 1.2 亿。每个字符串平均有 20-25 个字符,总数据大小超过我们默认的 spark.driver.maxResultSize
1GB。我不想更改 maxResultSize
,因为将来输入数据的大小增加时我将不得不再次更改它。
在 Spark 中,我是否可以通过调用 BloomFilter.putString()
以小块流式传输数据帧中的数据并训练 BloomFilter?我也尝试过使用 Dataset.toLocalIterator()
但由于源数据集的性质,我不得不将它合并为 100 个大分区,使得这 100 个分区中的每一个都太大而无法容纳在驱动程序内存中。
作为最后的手段,我正在考虑将数据收集到一个 HDFS 文件中并使用 DFSInputStream 读取它,但如果 Spark 中内置了一些东西,我想避免它。
最佳答案
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
关于hadoop - 使用大型数据集在 Spark 上训练 BloomFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45641835/