学習用の単純な Scala プログラムでHadoop のワード カウントマップ/reduce ロジックを再作成しようとしています
これは私がこれまでに持っているものです
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)
これは機能しているようですが、reduce 部分 (foldLeft) を処理するためのより慣用的な方法があると確信しています。
おそらくマルチマップについて考えていましたが、Scala にはこれを簡単に行う方法があると感じています。
ある?たとえば、マップに追加する方法、およびキーが存在する場合は、それを置き換える代わりに、値を既存の値に追加します。この質問をどこかで見たことがあると思いますが、見つけることができず、答えも見つかりませんでした。
おそらく現実の世界でそれを行う方法であることは知っgroupBy
ていますが、上記のリンクの元のマップ/リデュースロジックにできるだけ近い方法で実装しようとしています。