Scala:编写一个 MapReduce 程序来查找一个单词后面的单词 [作业]

Scala: write a MapReduce progam to find a word that follows a word [Homework]

我有一个家庭作业,我必须在 Scala 中编写一个 MapReduce 程序来查找文件中的 每个单词 哪个单词跟随最多的。

例如,对于单词 "basketball",接下来单词 "is" 出现了 5 次,"has" 出现了 2 次,"court" 出现了 1 次。

在文本文件中,这可能显示为:

篮球是.....(这个序列出现了 5 次) 篮球有……(这个序列发生了 2 次) 篮球场....(这个序列发生 1 次)

我很难从概念上弄清楚如何做到这一点。

我有过但未能成功实现的想法是

遍历每个单词,如果单词是 basketball,则取下一个单词并将其添加到地图中。按键归约,从高到低排序。

不幸的是,我不知道如何获取单词列表中的下一个单词。

例如,我想做这样的事情

    val lines = spark.textFile("basketball_words_only.txt") // process lines in file

    // split into individual words
    val words = lines.flatMap(line => line.split(" "))

    var listBuff = new ListBuffer[String]() // a list Buffer to hold each following word

    val it = Iterator(words)  

    while (it.hasNext) {
      listBuff += it.next().next() // <-- this is what I would like to do    
    }

    val follows = listBuff.map(word => (word, 1))
    val count = follows.reduceByKey((x, y) => x + y) // another issue as I cannot reduceByKey with a listBuffer

    val sort = count.sortBy(_._2,false,1)

    val result2 = sort.collect()

    for (i <- 0 to result2.length - 1) {
     printf("%s follows %d times\n", result1(2)._1, result2(i)._2);
    }

如有任何帮助,我们将不胜感激。如果我过度思考这个问题,我愿意接受不同的想法和建议。

下面是使用 MLlib 的滑动函数的一种方法:

import org.apache.spark.mllib.rdd.RDDFunctions._

val resRDD = textFile.
  flatMap(_.split("""[\s,.;:!?]+""")).
  sliding(2).
  map{ case Array(x, y) => ((x, y), 1) }.
  reduceByKey(_ + _).
  map{ case ((x, y), c) => (x, y, c) }.
  sortBy( z => (z._1, z._3, z._2), false )