所以,我想读取和RDD到一个数组。为此,我可以使用收集方法。但是这种方法真的很烦人,因为在我的情况下它继续给出kyro缓冲区溢出错误。如果我将kyro缓冲区大小设置得太多,它就会开始出现问题。另一方面,我注意到如果我只是使用 saveAsTextFile 方法将RDD保存到文件中,我就没有错误。所以,我在想,必须有一些更好的方法将RDD读入数组,这与收集方法一样没有问题。
答案 0 :(得分:4)
没有。 collect
是将RDD读入数组的唯一方法。
saveAsTextFile
永远不必将所有数据收集到一台计算机上,因此它不受{1}}上同一台计算机上可用内存的限制。
答案 1 :(得分:1)
toLocalIterator()
此方法返回包含此RDD中所有元素的迭代器。迭代器将消耗与此RDD中最大分区一样多的内存。处理RunJob以评估每个步骤上的一个分区。
>>> x = rdd.toLocalIterator()
>>> x
<generator object toLocalIterator at 0x283cf00>
然后你可以通过
访问rdd中的元素empty_array = []
for each_element in x:
empty_array.append(each_element)
https://spark.apache.org/docs/1.0.2/api/java/org/apache/spark/rdd/RDD.html#toLocalIterator()