Spark Scala-获取数据集列并转换为Seq

时间:2019-06-26 23:47:51

标签: scala apache-spark dataset seq

我有一个数据集

case class MyDS ( id: Int, name: String )

我想不使用collect来获取序列中的所有名称。

我经历了各种各样的帖子,而我发现的唯一解决方案是使用collect。有没有不使用collect的更好的方法

下面是我运行的代码,可以编译但由于内存而出错

ds.collect().map(x => x.name)

我是Scala的新手,因此有些人可能会觉得这个问题很愚蠢,但如果有人可以在不否决该问题的情况下分享某些东西,我将不胜感激

1 个答案:

答案 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