Scala hashmap没有附加

时间:2017-04-11 22:26:27

标签: scala apache-spark

我不明白下面的代码有什么问题。这工作正常,如果我的输入数据框没有被分区,hashmap typeMap会更新。但是,如果以下代码在分区环境中执行,typeMap始终为空且未更新。这段代码有什么问题?谢谢你的帮助。

var typeMap = new mutable.HashMap[String, (String, Array[String])]
case class Combiner(,,,,,,,    mapTypes: mutable.HashMap[String, (String, Array[String])]) {
    def execute() {
        <...>
        val combinersResult = dfInput.rdd.aggregate(combiners.toArray) (incrementCount, mergeCount)
    }

    def updateTypes(arr: Array[String], tempMapTypes:mutable.HashMap[String, (String, Array[String])]): Unit = {
        <...>
        typeMap ++= tempMapTypes
    }

    def incrementCount(combiners: Array[Combiner], row: Row): Array[Combiner] = {
        for (i <- 0 until row.length) {
            val array = getMyType(row(i), tempMapTypes)
            combiners(i). updateTypes(array, tempMapTypes)
        }
        combiners
}

1 个答案:

答案 0 :(得分:2)

在分布式计算中使用可变值是一个非常糟糕的主意。特别是Spark,RDD操作从驱动程序传送到执行程序,并在集群中的所有不同机器上并行执行。对您的mutable.HashMap所做的更新永远不会发送回驱动程序,因此您首先会遇到在驱动程序上构建的空地图。

因此,您需要通过优先选择不变性来完全重新考虑您的数据结构,并记住在执行程序上触发的操作是独立且并行的。