【问题标题】:Spark scala - Fetch Dataset column and convert to SeqSpark scala - 获取数据集列并转换为 Seq
【发布时间】:2019-06-26 23:47:51
【问题描述】:

我有一个数据集

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

我想在不使用 collect 的情况下按顺序获取所有名称。

我浏览了各种帖子,我找到的唯一解决方案是收集。有没有更好的方法不使用收集来做到这一点

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

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

我是 Scala 的新手,因此有些人可能会认为这个问题很愚蠢,但如果有人可以分享一些东西而不会对这个问题投反对票,我将不胜感激

【问题讨论】:

  • 为什么需要收集Driver上的数据?是否存在阻止您以分布式方式使用“名称”的技术要求?

标签: scala apache-spark dataset seq


【解决方案1】:
.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2018-11-29
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多