【发布时间】:2017-11-22 04:22:04
【问题描述】:
我在使用Spark mapPatartitions时遇到了一些奇怪的事情,创建的mutable.HashSet在map过程中无法正确填写,代码如下:
object Test {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Test").setMaster("local")
val sc = new SparkContext(conf)
val input = List[String]("1", "2", "3", "3", "4", "5", "5")
val result = sc.parallelize(input)
.mapPartitions((pi: Iterator[String]) => {
val valuesInPartition = new mutable.HashSet[String]()
val values = pi.map(line => {
valuesInPartition.add(line)
println("processing line: " + line + ", valuesInPartition: " + valuesInPartition)
})
println("valuesInPartition: " + valuesInPartition)
values
})
result.collect
}
}
和输出:
valuesInPartition: Set()
processing line: 1, valuesInPartition: Set(1)
processing line: 2, valuesInPartition: Set(1, 2)
processing line: 3, valuesInPartition: Set(3, 1, 2)
processing line: 3, valuesInPartition: Set(3, 1, 2)
processing line: 4, valuesInPartition: Set(3, 4, 1, 2)
processing line: 5, valuesInPartition: Set(3, 4, 1, 5, 2)
processing line: 5, valuesInPartition: Set(3, 4, 1, 5, 2)
但据我了解,mapPartition 中的代码应该按顺序执行,它应该在“map”函数完成后在最后打印第一行。但是这里的 Set 是打印出来的,没有填充值。
我想我在这里理解错了,请帮我指出。
【问题讨论】:
标签: scala apache-spark iterator