Я пытаюсь воссоздать Hadoop число слов map/уменьшить логику в простой программе Scala для обучения
Это то, что я до сих пор
val words1 = "Hello World Bye World"
val words2 = "Hello Hadoop Goodbye Hadoop"
val input = List(words1,words2)
val mapped = input.flatMap(line=>line.split(" ").map(word=>word->1))
//> mapped : List[(String, Int)] = List((Hello,1), (World,1), (Bye,1),
// (World,1), (Hello,1), (Hadoop,1),
// (Goodbye,1), (Hadoop,1))
mapped.foldLeft(Map[String,Int]())((sofar,item)=>{
if(sofar.contains(item._1)){
sofar.updated(item._1, item._2 + sofar(item._1))
}else{
sofar + item
}
})
//>Map(Goodbye -> 1, Hello -> 2, Bye -> 1, Hadoop -> 2, World -> 2)
Это похоже на работу, но я уверен, что существует более идиоматический способ обработки сокращенной части (foldLeft)
Я думал о мультимапе, но у меня есть чувство, что Scala имеет способ сделать это легко
Есть ли? например способ добавить к карте, и если ключ существует, вместо его замены, добавив значение к существующему значению. Я уверен, что видел этот вопрос где-то, но не смог найти его и ни ответа.
Я знаю, что groupBy
- это способ сделать это, вероятно, в реальном мире, но я пытаюсь реализовать его как можно ближе к исходной карте/сокращению логики в ссылке выше.