2015-05-04 7 views
6

möchte ich Ausnahme in der Karte() Funktion ignorieren, zum Beispiel:Wie behandelt man die Exception in Spark Map() Funktion?

rdd.map(_.toInt) 

wo rdd ein RDD[String] ist.

aber wenn es non-number string trifft, wird es fehlschlagen.

Was ist die einfachste Art, Ausnahmen zu ignorieren und diese Zeile zu ignorieren? (Ich will nicht, Filter verwenden Ausnahme zu behandeln, weil es viele andere Ausnahmen so sein kann ...)

+0

Keine puren Funktionen erforderlich, um Ausnahmen zu behandeln: zuerst filtern. – user2864740

+0

Ich glaube nicht, Filter ist eine gute Idee, weil ich jetzt nicht alle möglichen Fehler aufzählen könnte ... so könnte das laufende Programm plötzlich plötzlich fehlschlagen ... – user2848932

+0

Überhaupt nicht. Der Filter akzeptiert nur Werte, die beim Parsen keine Ausnahme auslösen können: Zeichenketten, die als Integer analysierbar sind, was wohldefiniert ist. Die 'toInt'-Funktion kann "zufällige Fehler" auslösen, dann befinden Sie sich in einem anderen Pickle (und einer anderen Frage). – user2864740

Antwort

4

Ich empfehle Ihnen, Filter/Karte

rdd.filter(r=>NumberUtils.isNumber(r)).map(r=> r.toInt) 

oder flatmap

exampleRDD.flatMap(r=> {if (NumberUtils.isNumber(r)) Some(r.toInt) else None}) 
zu verwenden

Ansonsten können Sie Ausnahme in Kartenfunktion

myRDD.map(r => { try{ 
     r.toInt 
    }catch { 
     case runtime: RuntimeException => { 
     -1 
     } 
    } 
}) 

fangen und dann Filter anwenden (auf -1)

+0

gibt es andere Manieren? Ich glaube nicht, Filter ist eine gute Idee, denn ich konnte jetzt nicht alle möglichen Fehler aufzählen ... so könnte das laufende Programm plötzlich plötzlich fehlschlagen ... – user2848932

+0

ok, ich habe meine Antwort aktualisiert – banjara

+0

Wie können Sie u benutze scala option mit rdds flatMap? – abalcerek

19

Sie können eine Kombination aus Try und Karte/Filter verwenden.

Versuchen Sie, Ihre Berechnung in Erfolg zu verpacken, wenn sie sich wie erwartet verhalten oder Fehler, wenn eine Ausnahme ausgelöst wird. Dann können Sie filtern, was Sie wollen - in diesem Fall die erfolgreichen Berechnungen, aber Sie könnten auch die Fehlerfälle zum Beispiel für die Protokollierung filtern.

Der folgende Code ist ein möglicher Ausgangspunkt. Sie können es in scastie.org laufen und erforschen, um zu sehen, ob es Ihren Bedürfnissen entspricht.

import scala.util.Try 

object Main extends App { 

    val in = List("1", "2", "3", "abc") 

    val out1 = in.map(a => Try(a.toInt)) 
    val results = out1.filter(_.isSuccess).map(_.get) 

    println(results) 

} 
Verwandte Themen