我通过 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 是 Iterator,当你用 map 遍历它时,它没有更多的值,并考虑到 length 是 size 的快捷方式,它是这样实现的:
def size: Int = {
var result = 0
for (x <- self) result += 1
result
}
你得到 0。
关于scala - RDD 的 foreachPartition 方法内的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884322/