2016-07-28 6 views
1

In Spark-Versuche kann ich Ausnahmen auf diese Weise handhaben:Wie erhöhe ich mit Scala Scheitern

val myRDD = sc.textFile(path) 
.map(line => Try {  
    // do something dangerous 

    // if(condition) 
    // raise isFailure; 

}).filter(_.isSuccess).map(_.get) 

ich das Element durch die erste Map-Funktion lesen möchte Versagen als auch zu erhöhen, unter bestimmten Bedingungen. Wie mache ich es?

+0

Verwenden Sie das Schlüsselwort throw? –

+0

Welche Ausnahme soll ich werfen? – Bob

Antwort

2

könnten Sie Either

myRDD.map(line=> if (condition) Left("some Error") else Right(somevalue)) 
    .collect { case Right(v) => v } 

verwenden Daraus ergibt sich ein Ergebnis, was in den erfolgreichen Zuordnungen war. Aber Sie wollen wahrscheinlich etwas mit den Fehlern tun, wenn Sie den obigen Code verwenden (beispielsweise mit einem partition { } Wenn nicht die Option Ansatz verwenden.

Oder nutzen Sie eine einfache Option:

myRDD.map(line=> if (condition) None else Some(somevalue)) 
    .flatten() 

Wenn Sie wollte kombinieren letzte Option mit Ihrem Try, verwenden sie so etwas wie

myRDD.map(line=> Try{ 
      /*something dangerous*/ 
      if (condition) None else Some(somevalue) 
     }) 
    .collect{ case Success(r) => r } // successful results 
    .flatten() // flatten out the Nones 

IMHO (und viele andere), unterlassen, sich Ausnahmen in scala zu werfen. ich sehe sie als Phantasie goto-Anweisungen th Springen Sie nicht innerhalb einer Dimension durch Code, sondern durch verschiedene Dimensionen (d. h. den Stapel). Sie sind Teil der Java-Plattform, daher müssen wir mit ihnen umgehen, wenn wir auf Java-Code zugreifen (außerdem müssen Sie möglicherweise etwas werfen, wenn Sie etwas erstellen, das von Java-Entwicklern verwendet wird)

+0

Verwenden von 'Entweder' für explizite Ausnahmebehandlung in einem Anti-Muster in Scala. Es sollte verwendet werden, um zwei Fälle zu behandeln und sich darauf zu beziehen. Dinge wie "Entweder [String, Int]" sind , was auf ein schlechtes Anwendungsdesign hindeutet. Ich stimme der "Option" jedoch voll zu. – sebszyller

2

Wenn Sie ignorieren die tatsächlichen Fehler, können Sie nur für die Bedingung filtern (vorausgesetzt, dass die Bedingung vollständig von der Linie abhängt):

def condition(line: String): Boolean = ??? 

val myRDD = sc.textFile(path) 
    .map(line => Try { // do something dangerous }) 
    .filter(_.isSuccess) 
    .filter(condition) 
    .map(_.get) 
Verwandte Themen