2014-11-05 8 views
8
val lines: RDD[String] = sc.textFile("/tmp/inputs/*") 
val tokenizedLines = lines.map(Tokenizer.tokenize) 

In dem obigen Codeausschnitt kann die Tokenize-Funktion leere Zeichenfolgen zurückgeben. Wie überspringe ich das Hinzufügen zur Karte in diesem Fall? oder entfernen Sie leere Einträge nach dem Hinzufügen zur Karte?Entfernen von leeren Zeichenfolgen aus Karten in Scala

Antwort

23

tokenizedLines.filter(_.nonEmpty)

+0

ist dieser Filter das Ergebnis oder sie entfernen? Ich bin scharf darauf, sie zu entfernen. – Siva

+0

Der Filter gibt eine neue Auflistung ohne leere Zeichenfolgen zurück. – akagroundhog

+0

Wenn ich nach der Filterung die Tokenzeilen drucke, hat es immer noch leere Zeichenfolgen im Array-Puffer. Fehle ich etwas zusätzlich? – Siva

1

Sie flatMap mit Option verwenden werden könnten kann?

sime Ding wie das lines.flatMap { case "" => Keine Fall s => Einige (en) }

+0

Ich kann Flatmap aus bestimmten Gründen nicht verwenden .. – Siva

+0

ow lines.flatMap {case "" => Nil case s => Seq (s)} so? – crak

0

val tokenizedLines = (lines.map (Tokenizer.tokenize)). Filter (_.nonEmpty)

10

Die derzeit akzeptierte Antwort, mit filter und nonEmpty, verursacht eine gewisse Leistungseinbuße, da nonEmpty ist keine Methode auf String, sondern stattdessen es durch implizite Konvertierung hinzugefügt wird. Wenn Wertobjekte verwendet werden, erwarte ich, dass der Unterschied fast nicht wahrnehmbar ist, aber bei Versionen von Scala, wo dies nicht der Fall ist, ist es ein wesentlicher Erfolg.

Stattdessen könnte man diese verwenden, die gewährleistet ist, schneller zu sein:

tokenizedLines.filterNot(_.isEmpty) 
Verwandte Themen