我正在尝试为数据帧中的大量字符串创建一个布隆过滤器 - ~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