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

标签 hadoop apache-spark spark-dataframe bloom-filter

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

相关文章:

apache-spark-sql - spark sql子字符串函数有什么问题?

java - samza 容器失败

apache - Storm ui错误:org.apache.storm.utils.NimbusLeaderNotFoundException:从种子主机[localhost]中找不到领导者雨云

apache-spark - 如何将 Great Expectations 结果从 Apache Spark 保存到文件 - 使用数据文档

apache-spark - 为什么我的 pyspark 在启动时在 yarn 中以 ACCEPTED 状态挂起?

scala - 如何在 Hue/Notebook/Scala/Spark 中漂亮地打印数据框?

hadoop - 在 oozie 中多次提交相同的协调员工作

java - 获取传递给 hadoop 映射器的行的最后一个字

java - 无法定位 Spark Jar : Java ClassNotFoundException

apache-spark - 从 PySpark 中的列加载 XML 字符串