我知道这个问题并不是什么新事物,但我的背景是不同的。我一直在尝试尽可能有效地处理异常.Below是我的实验代码
val in = List("1", "2", "3", "abc")
val sc = prepareConfig();
val rdd = sc.parallelize(in)
val mapRDD = rdd.map { x => Try { x.toInt } }
val successRDD = mapRDD.filter { x => x.isSuccess }
val successRDD2 =
successRDD.map { x => Try { x.get * x.get } }.filter{ _.isSuccess }
.
. // some more Transformation operations based on the use case
.
successRDD10.collect()
假设我可能需要进行10次转换才能产生最终结果。我是否需要尝试{}进行所有转换?期望是我可能会在10次转换中遇到任何错误。所以我试图过滤成功的结果并将其传递到下一阶段。那么上述是有效的异常处理方式还是推荐的其他替代方法?
答案 0 :(得分:2)
更好的方法:
val res: RDD[Int] = rdd.flatMap(x => Try(x.toInt).map(i => i * i).toOption)
它真正做到了你想要实现的目标。怎么样?
String
都会转换为Int
:Try(x.toInt)
map(i => i * i)
Try[Int]
为Option[Int]
,则生成的None
将转换为Try[Int]
Failure
,否则转换为Some(value)
toOption
1}} flatMap
操作,只有Option[Int]
已定义(即None
,因此转化成功)仍保留在生成的RDD[Int]
无需额外的过滤器和isSuccess
来电。