将未排序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%的错误。
+0
谢谢@ayplam! 'approxQuantile'的空间/时间复杂度的效率是多少? –
+1
@ K.Chen'O(log(xN))'其中x是近似值(0.1)。 – philantrovert
前10%听起来像你有某种类型的订单。如果是这样,最好的方法是排序所有内容,然后使用'limit',正如你所说的那样。否则,你怎么知道前10%的数据是什么? – Shaido
@Shaido,当然有一些'Ordering'与这个类型相关联。 –
这没有意义。你想要一些'订购',但你有一个未分类的RDD。你为什么要抽样? – eliasah