我有一个数据集
case class MyDS ( id: Int, name: String )
我想不使用collect来获取序列中的所有名称。
我经历了各种各样的帖子,而我发现的唯一解决方案是使用collect。有没有不使用collect的更好的方法
下面是我运行的代码,可以编译但由于内存而出错
ds.collect().map(x => x.name)
我是Scala的新手,因此有些人可能会觉得这个问题很愚蠢,但如果有人可以在不否决该问题的情况下分享某些东西,我将不胜感激
答案 0 :(得分:0)
.toLocalIterator().map(...).forEach(...add to Seq)
这将一次在驱动程序上处理分区(与将整个RDD放入驱动程序内存相比)。驱动程序上所需的内存等于最大分区的大小。
测试Seq是否适合驱动程序内存:
.map(x => x.name).collect().toSeq()
此方法将在将数据发送到驱动程序之前减小RDD(及其分区)的大小。如果这导致驱动程序内存不足,则唯一的选择是增加驱动程序内存。
此处注意:
https://spark.apache.org/docs/2.2.0/api/java/org/apache/spark/rdd/RDD.html#collect https://spark.apache.org/docs/2.2.0/api/java/org/apache/spark/rdd/RDD.html#toLocalIterator