如何从Apache Spark RDD获取大N的前N个元素

时间:2015-09-02 11:37:14

标签: algorithm apache-spark rdd

我有一个RDD[(Int, Double)](其中Int是唯一的)有大约4亿个条目,需要获得前N. rdd.top(N)(Ordering.by(_._2))适用于小N(测试高达100,000),但是当我需要时前100万,我遇到了这个错误:

Total size of serialized results of 5634 tasks (1024.1 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

我理解错误发生的原因(尽管我想象的是为什么1024字节用于序列化单个对(Int, Double)),我也明白我可以通过增加spark.driver.maxResultSize来克服它,但是这个解决方案只能达到某个N,我不知道它是否会起作用,直到整个工作崩溃。

如何在不使用toptakeOrdered的情况下有效地获得前N个条目,因为它们都返回Array s,这对于大N来说可能会变得太大?

Scala解决方案是首选。

1 个答案:

答案 0 :(得分:1)

所以有一些解决方案。最简单的是启用kyro序列化,这可能会减少所需的内存量。

另一个会使用sortByKey后跟mapPartitionsWithIndex来获取每个分区的计数,然后确定需要保留哪些分区,然后使用生成的RDD(如果你这个更好可以在RDD上表达其余的操作。)

如果您需要驱动程序中的本地顶部n,则可以使用sortByKey,然后缓存生成的RDD并使用toLocalIterator

希望这三种方法中的一种能满足您的需求。