将未排序RDD的前10%返回为Spark中另一个RDD的有效方法?
任务:给出一些RDD[Int]
的巨大未排序输入数据集,返回前10%作为另一个RDD[Int]
。将未排序RDD的前10%返回为Spark中另一个RDD的有效方法?
为什么输出类型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%的错误。
以上是 将未排序RDD的前10%返回为Spark中另一个RDD的有效方法? 的全部内容, 来源链接: utcz.com/qa/261405.html