2016-05-23 5 views
0

Ich habe eine Datei und ich möchte es zu einem MLLIB-Algorithmus geben. So folge ich dem Beispiel und tun so etwas wie:Wie man Linie in Funken rdd Kartenaktion basierend auf If Bedingung überspringt

val data = sc.textFile(my_file). 
    map {line => 

     val parts = line.split(","); 
     Vectors.dense(parts.slice(1, parts.length).map(x => x.toDouble).toArray) 
}; 

und das funktioniert, außer dass manchmal habe ich eine fehlende Funktion. Das ist manchmal eine Spalte einer Zeile hat keine Daten und ich möchte Zeilen wie diese wegwerfen.

Deshalb möchte ich so etwas wie dieses map{line => if(containsMissing(line) == true){ skipLine} else{ ... //same as before}}

tun, wie ich diese skipLine Wirkung tun kann?

Antwort

1

können filter Funktion verwenden solche Leitungen zu filtern:

val data = sc.textFile(my_file) 
    .filter(_.split(",").length == cols) 
    .map {line => 
     // your code 
    }; 

variable Angenommen cols Anzahl von Spalten in einer Zeile gültig hält.

0

können Sie verwenden flatMap, Some und keine dafür:

def missingFeatures(stuff): Boolean = ??? // Determine if features is missing 

val data = sc.textFile(my_file) 
    .flatMap {line => 
    val parts = line.split(","); 
    if(missingFeatures(parts)) None 
    else Some(Vectors.dense(parts.slice(1, parts.length).map(x => x.toDouble).toArray)) 
}; 

diese Weise können Sie Mapping über die rdd mehr als einmal vermeiden.