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

时间:2017-04-25 03:12:31

标签: scala apache-spark mapreduce

我有一个家庭作业,我必须在Scala中编写MapReduce程序,以便在文件中找到 每个单词 ,这个单词最后面的单词。

例如,对于单词" basketball",单词"是"接下来是5次,"有" 2次," court" 1次。

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

篮球是.....(这个序列发生了5次) 篮球有......(这个序列发生了2次) 篮球场....(这个序列发生一次)

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

我已经拥有但未能成功实施的想法是

迭代每个单词,如果单词是篮球,请使用下一个单词并将其添加到地图中。按键减少,从最高到最低排序。

不幸的是,我不知道如何在单词列表中使用下一个单词。

例如,我想做类似的事情

    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);
    }

任何帮助将不胜感激。如果我在思考这个问题,我会对不同的想法和建议持开放态度。

1 个答案:

答案 0 :(得分:4)

这是使用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 )