2017-04-25 7 views
0

単語を次の単語[宿題]を見つけることのMapReduce progamを書くための各単語最も後に続く。スカラ:単語ファイルで、私は私が見つけるためにScalaでのMapReduceプログラムを書く必要があります宿題を持って

たとえば、「バスケットボール」という単語の場合、「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); 
    } 

ような何かをしたいと思います。私がこれを考え過ぎているなら、私はさまざまなアイデアや提案をすることができます。ここで

答えて

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) 
関連する問題