Spark toLocalIterator和iterator方法之间的区别

5

编写Spark程序时,我遇到了toLocalIterator()方法。之前我只使用iterator()方法。

如果有人曾经使用过这个方法,请帮忙解释一下。

我在使用foreachforeachPartition方法时遇到了它。

我能否将foreach方法的结果传递给toLocalIterator方法,或者反过来?

toLocalIterator() -> foreachPartition()
iterator() -> foreach()
1个回答

11
首先,不应该直接调用RDD中的迭代器方法。如您可以在[Javadocs](https://spark.apache.org/docs/1.0.2/api/java/org/apache/spark/rdd/RDD.html#iterator(org.apache.spark.Partition, org.apache.spark.TaskContext))中所读到的:这不应该被用户直接调用,但对于实现自定义RDD子类的开发人员是可用的。 至于toLocalIterator,它用于将分散在集群中的RDD数据收集到一个节点上,并在同一节点上处理所有数据。它类似于collect方法,但不返回List而是返回Iterator

foreach 用于对 RDD 中的每个元素应用一个函数,而 foreachPartition 用于对每个分区应用一个函数。在第一种方法中,您每次获取一个元素(以实现更好的并行化),而在第二种方法中,您获取整个分区(如果需要对所有数据执行操作)。

因此,在使用 foreachforeachPartition 对 RDD 应用函数后,您可以调用 toLocalIterator 获取带有 RDD 所有内容的迭代器并进行处理。但是,请注意,如果您的 RDD 很大,则可能会出现内存问题。如果您想在执行所需操作后再次将其转换为 RDD,请使用 SparkContext 再次并行化它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接