2017-08-11 60 views
0

我试图为数据框中的大量字符串创建布隆过滤器 - 大约1.2亿。平均每个字符串20-25个字符,总数据量超过我们的默认spark.driver.maxResultSize 1GB。我不想更改maxResultSize,因为将来输入数据的大小会增加时,我将不得不再次更改它。使用大型数据集在Spark上训练BloomFilter

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

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

回答

1

星火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 
+0

请在您的代码段中的'import'声明 – javadba

相关问题