我想忽略map()函数的异常,例如:如何处理spark map()函数中的异常?
rdd.map(_.toInt)
其中RDD为RDD[String]
。
但是,如果它遇到非数字字符串,它将失败。
忽略任何异常并忽略该行的简单方法是什么? (我不希望使用过滤器来处理异常,因为可能有很多其他的例外...)
我想忽略map()函数的异常,例如:如何处理spark map()函数中的异常?
rdd.map(_.toInt)
其中RDD为RDD[String]
。
但是,如果它遇到非数字字符串,它将失败。
忽略任何异常并忽略该行的简单方法是什么? (我不希望使用过滤器来处理异常,因为可能有很多其他的例外...)
我建议你使用过滤器/地图
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)
还有其他礼仪吗? 我真的不认为过滤器是一个好主意,因为我现在无法列举所有可能的错误...所以正在运行的程序可能在某一天突然失败... – user2848932
好吧,我已经更新了我的答案 – banjara
在rdd的flatMap中使用scala选项? – abalcerek
您可以使用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)
}
不需要纯函数来处理异常:先过滤。 – user2864740
我真的不认为过滤器是一个好主意,因为我现在无法列举所有可能的错误......所以正在运行的程序可能在某一天突然失败...... – user2848932
完全不是。过滤器只接受无法在解析时抛出异常的值:可以解析为整数的字符串,它是精确定义的。 'toInt'函数可以“抛出随机错误”,然后你又进入了另一个pickle(和另一个问题)。 – user2864740