Scala 为什么组合器从未在spark Aggregative Ebykey中调用过?
我正在试图了解Scala 为什么组合器从未在spark Aggregative Ebykey中调用过?,scala,apache-spark,Scala,Apache Spark,我正在试图了解aggregateByKey如何在spark中工作 下面的示例转换为 ("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5)) 到 使用下面的代码 val babyNamesCSV = spark.sparkContext.parallelize(List(("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5))) babyNamesCSV.aggregateBy
aggregateByKey
如何在spark中工作
下面的示例转换为
("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5))
到
使用下面的代码
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
显示,是否有原因 为什么不尝试在输入中添加第三个元素以及数据中的一个键呢。然后,从两个函数中查找println
原因可能是,与驱动程序不在同一台机器/jvm上的工作者/执行者无法向驱动程序显示其标准输出。希望这有帮助。假设您在
local
模式下工作(不是集群/纱线等),我唯一能想象的是babyNamesCSV
只有一个分区,如果您只有一个核心或设置spark.master=local[1]
,就会发生这种情况。在这种情况下,不会调用合并器,因为不需要合并分区
尝试显式设置分区数:
val babyNamesCSV = spark.sparkContext.parallelize(List(("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5)), numSlices = 2)
val babyNamesCSV = spark.sparkContext.parallelize(List(("David", 6), ("Abby", 4), ("David", 5), ("Abby", 5)), numSlices = 2)