任务:给定一些巨大的未排序输入数据集 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/