algorithm - 将前 10% 的未排序 RDD 作为 Spark 中的另一个 RDD 返回的有效方法?

标签 algorithm scala sorting apache-spark

任务:给定一些巨大的未排序输入数据集 RDD[Int],返回前 10% 作为另一个 RDD[Int]

为什么输出类型 RDD[Int] 排在第一位?是因为输入太大,连前10%都装不进内存,这就是我不能调用的原因

sc.makeRDD(input.top(0.1 * input.count()))

因为输出将被“收集”到并耗尽驱动程序内存。

此问题通常通过对整个 输入进行排序,然后调用某种类型的limit() 来处理。但是这变得非常低效,因为

  • 至少对整个数据集进行了两次传递。 (一个获取数据集的大小,另一个涉及排序/...)
  • 我真正感兴趣的是前 10%,而不是剩下的 90%。

是否有有效的替代方案?

最佳答案

有一个数据帧操作调用 approxQuantile 可以为您工作,让您给出允许的错误。

rdd.toDF("num").approxQuantile("num", Seq(0.1), 0.05).rdd

然后是上面 rdd 上大约属于前 10% 且误差为 5% 的任何内容。

关于algorithm - 将前 10% 的未排序 RDD 作为 Spark 中的另一个 RDD 返回的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47863643/

相关文章:

algorithm - 删除导致 2 次旋转的最小大小的 AVL 树是多少?

functional-programming - Scala 组合器解析器到映射问题

scala - 在 ScalaTest + Mockito 中使用 Slick 模拟数据库并测试更新

java - 不要在枚举字段内排序

javascript - 根据另一个数组按顺序对数组进行排序

c# - 如何使用 LINQ 按深度级别对对象层次结构进行排序?

确定一个点是否在 3D 网格内的算法

algorithm - 如何在 Java Card 中存储离线交易数据

python - 在列表中查找元素索引的最快方法

java - 如何在 Scala 中将典型的 Json 文件格式打印到 Hashmap(Map) 中?