我在SparkSQL中有一个应用程序,它返回很多非常难以适应内存的行,因此我无法在DataFrame上使用collect函数,是否有一种方法可以将所有这些行作为一个作为列表的整个行的可迭代instaed。
注意:我正在使用yarn-client
执行此SparkSQL应用程序答案 0 :(得分:5)
一般来说,将所有数据传输到驱动程序看起来是一个非常糟糕的主意,并且大部分时间都有更好的解决方案但是如果你真的想要使用它,你可以在RDD上使用toLocalIterator
方法:
val df: org.apache.spark.sql.DataFrame = ???
df.cache // Optional, to avoid repeated computation, see docs for details
val iter: Iterator[org.apache.spark.sql.Row] = df.rdd.toLocalIterator
答案 1 :(得分:1)
实际上你可以使用:df.toLocalIterator
,这里是Spark源代码中的引用:
/**
* Return an iterator that contains all of [[Row]]s in this Dataset.
*
* The iterator will consume as much memory as the largest partition in this Dataset.
*
* Note: this results in multiple Spark jobs, and if the input Dataset is the result
* of a wide transformation (e.g. join with different partitioners), to avoid
* recomputing the input Dataset should be cached first.
*
* @group action
* @since 2.0.0
*/
def toLocalIterator(): java.util.Iterator[T] = withCallback("toLocalIterator", toDF()) { _ =>
withNewExecutionId {
queryExecution.executedPlan.executeToIterator().map(boundEnc.fromRow).asJava
}
}