У меня есть этот фрагмент 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
, поэтому это вызывает несоответствие типа. Я попробовал несколько разных вещей, например изменить параметр по умолчанию, чтобы быть более конкретным типом, но это просто вызвало другую ошибку.
Может кто-нибудь объяснить, что здесь происходит и как это исправить?
Спасибо, так ясно. Я неправильно понял что-то о связи «Карта» с кортежами. –