如何将数据集转换为Scala Iterable?

时间:2017-04-20 20:40:13

标签: scala apache-spark-sql

有没有办法将org.apache.spark.sql.Dataset转换为scala.collection.Iterable?看起来这应该很简单。

3 个答案:

答案 0 :(得分:4)

您可以myDataset.collectmyDataset.collectAsList

然后它将不再分发。如果您希望能够在多台计算机上分配计算,则需要使用其中一种分布式数据结构,例如RDD,Dataframe或Dataset。

如果您只需要在驱动程序上迭代内容,也可以使用toLocalIterator,因为它的优点是一次只能将一个分区加载到内存中而不是整个数据集中。 Iterator不是Iterable(虽然它是Traverable),但根据您的操作,它可能就是您想要的。

答案 1 :(得分:4)

您可以尝试这样的事情:

def toLocalIterable[T](dataset: Dataset[T]): Iterable[T] = new Iterable[T] {     
  def iterator = scala.collection.JavaConverters.asScalaIterator(dataset.toLocalIterator)
}

通过JavaConverters.asScalaIterator进行转换是必要的,因为toLocalIterator Dataset方法会返回java.util.Iterator而不是scala.collection.Iterator(这就是{{1}在} toLocalIterator上返回。)我怀疑这是一个错误。

答案 2 :(得分:1)

在Scala 2.11中,您可以执行以下操作:

import scala.collection.JavaConverters._

dataset.toLocalIterator.asScala.toIterable