2015-11-02 3 views
0

У меня есть этот фрагмент Scala из пользовательского сопоставителя (для использования в Spark mapPartitions) Я пишу для вычисления гистограмм нескольких полей Int одновременно.Тип несоответствия в Scala Map from getOrElse return Equals

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

Проблема заключается в том, что вы объявили ваш featureHistMap, как Map[Int, (Int, Long)] - обратите внимание, что вы отображение в Int пары (Int, Long). Позже вы попытаетесь извлечь из него значение как Map[Int, Long], а не пару (Int, Long).

Вы либо должны переопределить тип featureHistMap к Map[Int, Map[Int, Long]], или тип featureHist к (Int, Long).

+0

Спасибо, так ясно. Я неправильно понял что-то о связи «Карта» с кортежами. –

Смежные вопросы