我正在尝试在一个简单的 Scala 程序中重新创建 Hadoop 的字数图/减少逻辑以进行学习
这是我到目前为止所拥有的
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
这可能是在现实世界中实现它的方法,但我正在尝试尽可能接近上面链接中的原始映射/减少逻辑来实现它。