2015-11-02 78 views
0

我有這個斯卡拉片段從一個自定義的映射(用於一個星火mapPartitions)我正在寫計算同時多個Int字段的直方圖。類型不匹配在Scala地圖從getOrElse返回等於

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,因此這會導致類型不匹配。我嘗試了許多不同的東西,例如將默認參數更改爲更具體的類型,但這只是導致了不同的錯誤。

有人可以解釋這裏發生了什麼,以及如何解決它?

回答

2

問題是,您宣佈您的featureHistMapMap[Int, (Int, Long)] - 請注意,您正在將Int映射到一對(Int, Long)。稍後,您嘗試從中檢索一個值爲Map[Int, Long],而不是一對(Int, Long)

您需要重新聲明featureHistMap的類型爲Map[Int, Map[Int, Long]]featureHist(Int, Long)的類型。

+0

謝謝,很清楚。我誤解了有關Map的與元組的關係。 –