2016-08-01 28 views
0

Ich habe einige Probleme beim Extrahieren von Features aus Rohdaten festgestellt.Fehler beim Extrahieren von Features (Funke)

Hier ist meine Daten:

25,Private,226802,11th,7,Never-married,Machine-op-inspct,Own-child,Black,Male,0,0,40,United-States,0 

und hier ist mein Code:

val rawData = sc.textFile("data/myData.data") 
val lines = rawData.map(_.split(",")) 
val categoriesMap = lines.map(fields => fields(1)).distinct.collect.zipWithIndex.toMap 

Hier ist die Fehlerinfo:

Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 1.0 failed 1 times, most recent failure: Lost task 1.0 in stage 1.0 (TID 3, localhost): java.lang.ArrayIndexOutOfBoundsException: 1 

ich die zweite Spalte extrahieren möchten als das kategorische Feature, aber es scheint, dass es die Spalte nicht lesen kann und zu ArrayIndexOutOfBoundsException führt. Ich habe viele Male versucht, aber immer noch kann das Problem nicht lösen.


val categoriesMap1 = lines.map(fields => fields(1)).distinct.collect.zipWithIndex.toMap 
val labelpointRDD = lines.map { fields => 
    val categoryFeaturesArray1 = Array.ofDim[Double](categoriesMap1.size) 
    val categoryIdx1 = categoriesMap1(fields(1)) 
    categoryFeaturesArray1(categoryIdx1) = 1 } 
+0

Der Grund, warum Sie nicht zu lesen, vielleicht in der Lage ist, dass Ihre csv fehlende Werte haben könnte. Versuchen Sie, die Größe Ihrer Arrays nach der Teilung zu untersuchen – eliasah

Antwort

1

Ihr Code arbeitet für das Beispiel, das Sie geliefert - was es ist in Ordnung für „gültig“ Zeilen bedeutet - aber Ihre Eingabe enthält wahrscheinlich einige ungültige Zeilen - in diesem Fall Zeilen ohne Komma.

Sie können entweder Ihre Daten reinigen oder den Code verbessern diese Zeilen anmutiger zu handhaben, zum Beispiel einige Standardwert für schlechte Zeilen mit:

val rawData = sc.parallelize(Seq(
    "25,Private,226802,11th,7,Never-married,Machine-op-inspct,Own-child,Black,Male,0,0,40,United-States,0", 
    "BAD LINE" 
)) 

val lines = rawData.map(_.split(",")) 
val categoriesMap = lines.map { 
    case Array(_, s, _*) => s // for arrays with 2 or more items - use 2nd 
    case _ => "UNKNOWN"  // default 
}.distinct().collect().zipWithIndex.toMap 

println(categoriesMap) // prints Map(UNKNOWN -> 0, Private -> 1) 

UPDATE: pro aktualisiert Frage - vorausgesetzt, diese Zeilen sind in der Tat ungültig, können Sie sie einfach ganz überspringen, sowohl bei der Extraktion der Kategorien Karte und wenn an markierten Punkten abbildet:

val secondColumn: RDD[String] = lines.collect { 
    case Array(_, s, _*) => s // for arrays with 2 or more items - use 2nd 
    // shorter arrays (bad records) will be ~~filtered out~~ 
} 

val categoriesMap = secondColumn.distinct().collect().zipWithIndex.toMap 
val labelpointRDD = secondColumn.map { field => 
    val categoryFeaturesArray1 = Array.ofDim[Double](categoriesMap.size) 
    val categoryIdx1 = categoriesMap(field) 
    categoryFeaturesArray1(categoryIdx1) = 1 
    categoryFeaturesArray1 
} 
+0

@ C.Y.Wu das ist, was ich meinte. – eliasah

+0

Okay, ich werde das versuchen. Vielen Dank! –

+0

@eliasah Entschuldigung, darf ich eine zusätzliche Frage stellen: Wie kann ich die Funktion als String erhalten, wenn in meinen Daten ungültige Zeilen vorhanden sind? –