Scala 为什么在foreachPartition中partition.size变为零

Scala 为什么在foreachPartition中partition.size变为零,scala,apache-spark,Scala,Apache Spark,在下面的代码(用scala编写)中,我打印了partition.size两次,但得到了两个不同的结果 代码: 结果: 1. partition.size: 2 2. partition.size: 0 根据Spark API文档,分区是一种迭代器 def foreachPartition(f: (Iterator[T]) ⇒ Unit): Unit Applies a function f to each partition of this RDD. 那么为什么分区的大小设置

在下面的代码(用scala编写)中,我打印了partition.size两次,但得到了两个不同的结果

代码:

结果:

1. partition.size: 2
2. partition.size: 0
根据Spark API文档,分区是一种迭代器

  def foreachPartition(f: (Iterator[T]) ⇒ Unit): Unit
      Applies a function f to each partition of this RDD.

那么为什么分区的大小设置为0呢?

挖掘之后,我找到了答案,这不是Spark或您的程序的问题。它基本上按设计工作。我的意思是foreachpartition方法闭包将迭代器[T]作为输入,它是scala迭代器。在scala迭代器上调用size()方法时,它计算大小并移动到列表的末尾。查看Scala迭代器的文档

它返回的元素数注意:此操作结束后,它将处于结束状态


当您要求迭代器给出它将遍历它所指向序列中的每个元素的大小时,每次向右移动一个位置。当它没有更多的元素可以遍历迭代器时。hasNext==false将返回大小。但到那时,它将耗尽所有元素因此,当第二次检索大小时,它返回0

挖掘后,我找到了答案,这不是Spark或您的程序的问题。它基本上按设计工作。我的意思是foreachpartition方法闭包将迭代器[T]作为输入,它是scala迭代器。在scala迭代器上调用size()方法时,它计算大小并移动到列表的末尾。查看Scala迭代器的文档

它返回的元素数注意:此操作结束后,它将处于结束状态


当您要求迭代器给出它将遍历它所指向序列中的每个元素的大小时,每次向右移动一个位置。当它没有更多的元素可以遍历迭代器时。hasNext==false将返回大小。但到那时,它将耗尽所有元素因此,当第二次检索大小时,它返回0

@Moriarty,这是否回答了您的问题?谢谢您的回答。Scala迭代器的文档也非常有用。由于迭代后返回0是正确的,所以我发现另一个有趣的事情是数组[T].iterator.size每次调用时都返回一个非零值。我将阅读scala.Array的源代码,稍后再找到答案。再次感谢。:)@莫里亚蒂,这能回答你的问题吗?谢谢你的回答。Scala迭代器的文档也非常有用。由于迭代后返回0是正确的,所以我发现另一个有趣的事情是数组[T].iterator.size每次调用时都返回一个非零值。我将阅读scala.Array的源代码,稍后再找到答案。再次感谢。:)
  def foreachPartition(f: (Iterator[T]) ⇒ Unit): Unit
      Applies a function f to each partition of this RDD.