2017-12-18 181 views
1

任务:给出一些RDD[Int]的巨大未排序输入数据集,返回前10%作为另一个RDD[Int]将未排序RDD的前10%返回为Spark中另一个RDD的有效方法?

为什么输出类型RDD[Int]在第一位?这是因为输入的是如此之大以至于连前10%的不适合到内存中,这就是原因,我不能叫

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

作为输出将被“收集”到排气驾驶员记忆。

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

  • 整个数据集至少要经过两遍。 (一拿到数据集的大小,以及其他涉及分拣/ ...)
  • 我在排名前10%真正感兴趣,而不是剩余的90%。

有没有高效的选择?

+1

前10%听起来像你有某种类型的订单。如果是这样,最好的方法是排序所有内容,然后使用'limit',正如你所说的那样。否则,你怎么知道前10%的数据是什么? – Shaido

+0

@Shaido,当然有一些'Ordering'与这个类型相关联。 –

+1

这没有意义。你想要一些'订购',但你有一个未分类的RDD。你为什么要抽样? – eliasah

回答

1

有一个数据框操作调用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

相关问题