[英]Difference between Spark toLocalIterator and iterator methods
在编写Spark程序时,我遇到了这个toLocalIterator()
方法。 正如早些时候我只使用iterator()
方法。
如果有人曾经使用过这种方法,请扔一些灯。
我在Spark程序中使用foreach
和foreachPartition
方法时遇到过。
我可以将foreach
方法结果传递给toLocalIterator
方法或反之亦然。
toLocalIterator() -> foreachPartition()
iterator() -> foreach()
首先,不应该调用RDD中的iterator
方法。 正如您可以阅读[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
用于将函数应用于每个分区。 在第一种方法中,您一次获得一个元素(并行化更多),在第二种方法中,您获得整个分区(如果需要对所有数据执行操作)。
所以,是的,在使用foreach
或foreachPartition
将函数应用于RDD foreachPartition
您可以调用toLocalIterator
来获取包含RDD所有内容的迭代器并对其进行处理。 但是,请记住,如果您的RDD非常大,您可能会遇到内存问题。 如果要在执行所需的操作后再次将其转换为RDD,请使用SparkContext
再次并行化它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.