2017-04-23 6 views
0

Ich versuche, eine RDD einer Textdatei durchzulaufen, eine Zählung jedes einzelnen Wortes in der Datei vorzunehmen und dann alle Wörter, die jedem eindeutigen Wort folgen, zusammen mit ihren Zählungen zu akkumulieren. Bisher ist es das, was ich habe:Wie reducedByKey mit 3 Werten?

// connecting to spark driver 
val conf = new SparkConf().setAppName("WordStats").setMaster("local") 
val spark = new SparkContext(conf) //Creates a new SparkContext object 

//Loads the specified file into an RDD 
val lines = sparkContext.textFile(System.getProperty("user.dir") + "/" + "basketball_words_only.txt") 

//Splits the file into individual words 
val words = lines.flatMap(line => { 

    val wordList = line.split(" ") 

    for {i <- 0 until wordList.length - 1} 

    yield (wordList(i), wordList(i + 1), 1) 

}) 

enter image description here

Wenn ich nicht klar gewesen, so weit, was ich versuche zu tun, um die Menge der Wörter zu sammeln, die jedes Wort in die folgen Datei zusammen mit der Anzahl, wie oft die Worte ihren vorhergehenden Worten in der Form folgen:

(PrecedingWord, (FollowingWord, numberOfTimesWordFollows))

deren Datentypen sind (String, (String, Int))

Antwort

0

Sie wollen wahrscheinlich etwas in diese Richtung:

(for { 
    line <- lines 
    Array(word1, word2) <- line.split("\\s+").sliding(2) 
} yield ((word1, word2), 1)) 
.reduceByKey(_ + _) 
.map({ case ((word1, word2), count) => (word1, (word2, count)) }) 

By the way, Sie wahrscheinlich sicherstellen wollen, dass jede „Linie“ der linesRDD zu einem Satz entspricht, so dass Sie nicht Wortpaare gezählt über Satzgrenzen. Falls Sie es noch nicht getan haben, möchten Sie vielleicht in eine Bibliothek zur Verarbeitung natürlicher Sprache wie OpenNLP oder CoreNLP zur Erkennung von Satzgrenzen, Tokenisierung usw. schauen.

Verwandte Themen