使用spark和scala进行有效的异常处理

时间:2016-10-11 19:12:51

标签: scala apache-spark

我知道这个问题并不是什么新事物,但我的背景是不同的。我一直在尝试尽可能有效地处理异常.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次转换中遇到任何错误。所以我试图过滤成功的结果并将其传递到下一阶段。那么上述是有效的异常处理方式还是推荐的其他替代方法?

1 个答案:

答案 0 :(得分:2)

更好的方法:

val res: RDD[Int] = rdd.flatMap(x => Try(x.toInt).map(i => i * i).toOption)

它真正做到了你想要实现的目标。怎么样?

  1. 每个String都会转换为IntTry(x.toInt)
  2. 如果转化成功,则整数乘以其自身:map(i => i * i)
  3. 如果Try[Int]Option[Int],则生成的None将转换为Try[Int] Failure,否则转换为Some(value) toOption 1}}
  4. 感谢flatMap操作,只有Option[Int]已定义(即None,因此转化成功)仍保留在生成的RDD[Int]
  5. 无需额外的过滤器和isSuccess来电。