2017-01-12 4 views
2

Ich versuche, die Stoppwörter aus einer RDD von Wörtern aus einer .txt Datei herauszufiltern. Filter Stoppwörter in Spark

// Creating the RDDs 
val input = sc.textFile("../book.txt") 
val stopWordsInput = sc.textFile("../stopwords.csv") 
val stopWords = stopWordsInput.map(x => x.split(",")) 

// Create a tuple of test words 
val testWords = ("you", "to") 

// Split using a regular expression that extracts words 
val wordsWithStopWords = input.flatMap(x => x.split("\\W+")) 

Der Code vor allem macht Sinn für mich und scheint gut zu funktionieren. Hier habe ich Probleme.

//Remove the stop words from the list 
val words = wordsWithStopWords.filter(x => x != testWords) 

Dies läuft aber herauszufiltern nicht tatsächlich die in dem Tupel testWords enthaltenen Wörtern. Ich bin nicht sicher, wie man die Wörter in wordsWithStopWords gegen jedes Wort in meinem Tupel testet testWords

+0

Ich sehe nicht die Verwendung von testWords. – eliasah

Antwort

3

Sie prüfen einen Zeichenkette über ein a tuple ("you", "to"), das immer falsch ist. Hier

ist das, was Sie wollen versuchen:

val testWords = Set("you", "to") 
wordsWithStopWords.filter(!testWords.contains(_)) 

// Simulating the RDD with a List (works the same with RDD) 
List("hello", "to", "yes") filter (!testWords.contains(_)) 
// res30: List[String] = List(hello, yes) 
+0

Das scheint nicht zu funktionieren. Es gibt einen Fehler mit beiden '!' Und '.contains'. –

+0

Ich habe es gerade in meiner REPL getestet und es funktioniert ... – marios

+1

Ich mag das! :-) Sie können es auch so schreiben: 'wordsWithStopWords filterNot testWords'. – stefanobaghino

3

Sie können eine Broadcast-Variable mit Ihrem Stoppwörter RDD filtern:

// Creating the RDDs 
val input = sc.textFile("../book.txt") 
val stopWordsInput = sc.textFile("../stopwords.csv") 

// Flatten, collect, and broadcast. 
val stopWords = stopWordsInput.flatMap(x => x.split(",")).map(_.trim) 
val broadcastStopWords = sc.broadcast(stopWords.collect.toSet) 

// Split using a regular expression that extracts words 
val wordsWithStopWords: RDD[String] = input.flatMap(x => x.split("\\W+")) 
wordsWithStopWords.filter(!broadcastStopWords.value.contains(_)) 

Broadcast-Variablen können Sie einen halten Nur-Lese-Variable auf jeder Maschine zwischengespeichert, anstatt eine Kopie davon mit Aufgaben zu versenden. Sie können beispielsweise dazu verwendet werden, jedem Knoten in effizienter Weise (auch in diesem Fall) eine Kopie eines großen Eingabedatensatzes zu geben.