将未排序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

回到顶部