aggregateByKey
样例代码
val conf = new SparkConf().setAppName("SparkTest").setMaster("local[*]") val sc = new SparkContext(conf)
val data = sc.parallelize(List((1, 3), (1, 2), (1, 4), (2, 3))) def seq(a:Int, b:Int): Int = { println("seq: " + a + "\t " + b) math.max(a, b) } def comb(a:Int,b:Int):Int={ println("comb : "+a+"\t"+b) a+b } val result = data.aggregateByKey(0)(seq,comb) //.collect() result.collect().foreach(println)
函数介绍:
aggregateByKey函数对PairRDD中相同Key的值进行聚合操作,在聚合过程中同样使用了一个中立的初始值
例如我们的样例数据应该返回:(1,9)(2,3)
问题:
当我们conf设置为
(1)setMaster("local"),不执行comb,也就是返回结果没有累加
(2)
setMaster("local[2]"),执行comb,但是返回结果为(1,7),(2,3)
(3)
setMaster("local[3]")
或者
setMaster("local[*]"),执行comb,返回结果使我们预期的(1,9),(2,3)
总结:
怀疑对于data的计算默认使用并行计算,而我们设置lcoal时没有指定所用的cores数目,导致并行计算无法执行,只能保持某个计算结果,最终导致计算结果的错误。