如何在SparkSQL中使用Dataframe获得行迭代器



我在SparkSQL中有一个应用程序,它返回大量的行,非常难以适应内存,所以我将无法在DataFrame上使用collect函数,是否有一种方法可以让我将所有这些行作为Iterable而不是整个行作为列表。

我正在使用yarn-client执行这个SparkSQL应用程序。

一般来说,将所有数据传输到驱动程序看起来是一个非常糟糕的主意,大多数时候有一个更好的解决方案,但如果你真的想这样做,你可以在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 

实际上您可以使用: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
  }
}

相关内容

  • 没有找到相关文章

最新更新