我正试图了解aggregateByKey
的工作原理
下面的示例进行转换
("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5))
到
(Abby,Set(5, 4))
(David,Set(5, 6))
使用下面的代码
val babyNamesCSV = spark.sparkContext.parallelize(List(("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5)))
babyNamesCSV.aggregateByKey(new HashSet[Int])(
(k,v) => {
println("start")
println(k)
println(v)
println("end")
k += v
},
(v,k) => {
println("start2")
println(k)
println(v)
println("end2")
v ++ k
}).map(line => {
println(line)
line
}).take(100)
我发现即使println
确实没有在sbt
终端上显示组合器seqOp
,这是为什么吗?
答案 0 :(得分:1)
假设您在local
模式下工作(而不是集群/纱线等),我唯一可以想象的是babyNamesCSV
只有1个分区,如果您只有1个核心或您设置了spark.master=local[1]
。在这种情况下,永远不会调用合并器,因为不必合并任何分区...
尝试显式设置分区数:
val babyNamesCSV = spark.sparkContext.parallelize(List(("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5)), numSlices = 2)
答案 1 :(得分:0)
为什么不尝试在输入中使用数据中的键之一添加第三个元素。然后,从这两个函数中查找printlns。
原因可能是,与驱动程序不在同一台机器/ JVM上的工作程序/执行程序无法在驱动程序中显示其标准输出。希望这会有所帮助。