我有一个家庭作业,我必须在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);
}
任何帮助将不胜感激。如果我在思考这个问题,我会对不同的想法和建议持开放态度。
答案 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 )