为什么从未在Spark AggregateByKey中调用组合器?

时间:2019-09-28 04:14:36

标签: scala apache-spark

我正试图了解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,这是为什么吗?

2 个答案:

答案 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上的工作程序/执行程序无法在驱动程序中显示其标准输出。希望这会有所帮助。