从getOrElse返回等于Scala Map中的类型不匹配

时间:2015-11-02 18:31:24

标签: scala apache-spark

我从自定义映射器中获取此Scala片段(用于Spark mapPartitions)我正在编写以同时计算多个Int字段的直方图。

def multiFeatureHistogramFunc(iter: Iterator[Row]) : Iterator[(Int, (Int, Long))] = {
    var featureHistMap:Map[Int, (Int, Long)] = Map()
    while (iter.hasNext)
    {
        val cur = iter.next;

        indices.foreach( { index:Int => 
            val v:Int = if ( cur.isNullAt(index) ) -100 else cur.getInt(index)
            var featureHist:Map[Int, Long] = featureHistMap.getOrElse(index, Map())
            val newCount = featureHist.getOrElse(v,0L) + 1L
            featureHist += (v -> newCount)
            featureHistMap += (index -> featureHist)
        })
    }
    featureHistMap.iterator
}

但我得到的错误是:

<console>:49: error: type mismatch;
 found   : Equals
 required: Map[Int,Long]
               var featureHist:Map[Int, Long] = 
 featureHistMap.getOrElse(index, Map())
                         ^

我找不到这个具体问题的答案。在我看来,featureHistMap.getOrElse中的默认参数与featureHistMap本身的值字段的类型不同,并且公共父类型为Equals,因此这会导致类型不匹配。我尝试了许多不同的东西,比如将默认参数更改为更具体的类型,但这只会导致不同的错误。

有人可以解释这里发生了什么以及如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

问题在于您将<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <div id="mbody"> <div class="resources"> <ul> <a href="#"> <li data-color="#380606">Policies</a> </li> <a href="#"> <li data-color="#191919">LMS</a> </li> <a href="#"> <li data-color="#cbcbcb">Tips & Tricks</a> </li> <li data-color="#f08721"><a href="#">Forms</a> </li> </ul> </div> <div id="mbg"></div> </div>声明为featureHistMap - 请注意您正在将Map[Int, (Int, Long)]映射到一对Int。稍后,您尝试从(Int, Long)中检索一个值,而不是一对Map[Int, Long]

您需要将(Int, Long)的类型重新声明为featureHistMap,或将Map[Int, Map[Int, Long]]的类型重新声明为featureHist