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 )
我有一个家庭作业,我必须在 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 )