Scala RDD的foreachPartition方法中的意外行为

Scala RDD的foreachPartition方法中的意外行为,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我通过spark shell评估了以下几行scala代码: val a = sc.parallelize(Array(1,2,3,4,5,6,7,8,9,10)) val b = a.coalesce(1) b.foreachPartition { p => p.map(_ + 1).foreach(println) p.map(_ * 2).foreach(println) } 输出如下: 2 3 4 5 6 7 8 9 10 11 为什么分区p在第一次映射后变为空?我并不

我通过spark shell评估了以下几行scala代码:

val a = sc.parallelize(Array(1,2,3,4,5,6,7,8,9,10))
val b = a.coalesce(1)
b.foreachPartition { p => 
  p.map(_ + 1).foreach(println)
  p.map(_ * 2).foreach(println)
}
输出如下:

2
3
4
5
6
7
8
9
10
11

为什么分区p在第一次映射后变为空?

我并不觉得奇怪,因为p是迭代器,当您使用map遍历它时,它没有更多的值,并且考虑到长度是大小的快捷方式,实现方式如下:

def size: Int = {
  var result = 0
  for (x <- self) result += 1
  result
}
def大小:Int={
var结果=0

对于(x而言,答案在scala文档中。它明确指出,在调用迭代器map方法后,必须丢弃迭代器(p是迭代器)