2015-05-04 252 views
6

我想忽略map()函数的异常,例如:如何处理spark map()函数中的异常?

rdd.map(_.toInt) 

其中RDD为RDD[String]

但是,如果它遇到非数字字符串,它将失败。

忽略任何异常并忽略该行的简单方法是什么? (我不希望使用过滤器来处理异常,因为可能有很多其他的例外...)

+0

不需要纯函数来处理异常:先过滤。 – user2864740

+0

我真的不认为过滤器是一个好主意,因为我现在无法列举所有可能的错误......所以正在运行的程序可能在某一天突然失败...... – user2848932

+0

完全不是。过滤器只接受无法在解析时抛出异常的值:可以解析为整数的字符串,它是精确定义的。 'toInt'函数可以“抛出随机错误”,然后你又进入了另一个pickle(和另一个问题)。 – user2864740

回答

4

我建议你使用过滤器/地图

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

或flatmap

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

否则,你可以在地图功能赶例外

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

,然后应用过滤器(上-1)

+0

还有其他礼仪吗? 我真的不认为过滤器是一个好主意,因为我现在无法列举所有可能的错误...所以正在运行的程序可能在某一天突然失败... – user2848932

+0

好吧,我已经更新了我的答案 – banjara

+0

在rdd的flatMap中使用scala选项? – abalcerek

19

您可以使用Try和地图/过滤器的组合。

尝试将您的计算包装到成功,如果他们的行为如预期,或失败,如果引发异常。然后,你可以过滤你想要的东西 - 在这种情况下,成功的计算,但你也可以为记录目的过滤错误情况,例如。

下面的代码是一个可能的起点。您可以在scastie.org中运行并探索它,看它是否适合您的需求。

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) 

}