2015-05-04 18 views
6

chcę ignorować wyjątek w funkcji map(), na przykład:jak obsługiwać wyjątek w funkcji iskry()?

rdd.map(_.toInt) 

gdzie RDD jest RDD[String].

ale jeśli spełni on ciąg nie będący numerem, to się nie powiedzie.

jaki jest najprostszy sposób zignorowania wyjątku i zignorowania tej linii? (Nie chcę użyć filtru obsłużyć wyjątek, bo nie może być tak wiele innych wyjątki ...)

+0

Nie wymagają czystych funkcji do obsługi wyjątków: najpierw filtruj. – user2864740

+0

Naprawdę nie uważam, że filtr jest dobrym pomysłem, ponieważ nie mogłem teraz wyliczyć wszystkich możliwych błędów ... więc uruchomiony program może nagle przestać działać ... – user2848932

+0

Wcale. Filtr akceptuje tylko wartości, które nie mogą podać wyjątku podczas analizowania: łańcuchy, które można sparsować jako liczby całkowite, które są dobrze zdefiniowane. Funkcja 'toInt' może" rzucać losowe błędy ", wtedy jesteś w innym pikle (i innym pytaniu). – user2864740

Odpowiedz

4

polecam użyć filtra/mapa

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

lub flatmap

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

przeciwnym razie można złapać wyjątek w funkcji map

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

a następnie zastosować filtr (na -1)

+0

czy są inne sposoby? Naprawdę nie uważam, że filtr jest dobrym pomysłem, ponieważ nie mogłem teraz wyliczyć wszystkich możliwych błędów ... więc uruchomiony program może nagle się nie udało ... – user2848932

+0

OK, zaktualizowałem moją odpowiedź – banjara

+0

Jak możesz użyć opcji scala z mapą rdd's flatMap? – abalcerek

19

Można użyć kombinacji Try i mapy/filtra.

Spróbuj zapakuje twoje obliczenia w Sukces, jeśli zachowa się zgodnie z oczekiwaniami, lub Niepowodzenie, jeśli zostanie zgłoszony wyjątek. Następnie możesz filtrować, co chcesz - w tym przypadku udane obliczenia, ale możesz również filtrować przypadki błędów w celu rejestrowania, na przykład.

Poniższy kod jest możliwym punktem początkowym. Możesz uruchomić go i eksplorować w scastie.org, aby sprawdzić, czy odpowiada Twoim potrzebom.

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) 

} 
Powiązane problemy