我有一个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,我不知道它是否会起作用,直到整个工作崩溃。
如何在不使用top
或takeOrdered
的情况下有效地获得前N个条目,因为它们都返回Array
s,这对于大N来说可能会变得太大?
Scala解决方案是首选。
答案 0 :(得分:1)
所以有一些解决方案。最简单的是启用kyro序列化,这可能会减少所需的内存量。
另一个会使用sortByKey
后跟mapPartitionsWithIndex
来获取每个分区的计数,然后确定需要保留哪些分区,然后使用生成的RDD(如果你这个更好可以在RDD上表达其余的操作。)
如果您需要驱动程序中的本地顶部n,则可以使用sortByKey
,然后缓存生成的RDD并使用toLocalIterator
。
希望这三种方法中的一种能满足您的需求。