【发布时间】:2017-04-25 03:12:30
【问题描述】:
我有一个家庭作业,我必须在 Scala 中编写一个 MapReduce 程序来查找文件中每个单词最紧跟的单词。
例如,对于单词“basketball”,单词“is”接下来出现 5 次,“has”出现 2 次,“court”出现 1 次。
在文本文件中,这可能显示为:
篮球是.....(这个序列发生了 5 次) 篮球有.....(这个序列发生了2次) 篮球场....(此序列发生 1 次)
我很难从概念上弄清楚如何做到这一点。
我有过但未能成功实施的想法是
遍历每个单词,如果单词是篮球,则取出下一个单词并将其添加到地图中。按键归约,从高到低排序。
不幸的是,我不知道如何获取单词列表中的下一个单词。
例如,我想做这样的事情
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);
}
任何帮助将不胜感激。如果我想得太多了,我愿意接受不同的想法和建议。
【问题讨论】:
标签: scala apache-spark mapreduce