有没有办法将org.apache.spark.sql.Dataset转换为scala.collection.Iterable?看起来这应该很简单。
答案 0 :(得分:4)
您可以myDataset.collect
或myDataset.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