如何使用Scala Try引发失败

时间:2016-07-28 09:46:18

标签: scala apache-spark

在Spark中,我可以这样处理异常:

val myRDD = sc.textFile(path)
.map(line => Try {    
   // do something dangerous

   // if(condition)
   //   raise isFailure;

}).filter(_.isSuccess).map(_.get)

在某些情况下,我喜欢第一个map函数读取的元素也会引发失败。我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用Either

myRDD.map(line=> if (condition) Left("some Error") else Right(somevalue))
    .collect { case Right(v) => v }

这给出了成功映射中的任何结果。但是如果使用上面的代码(例如partition { }),你可能想对失败做些什么。如果不使用Option方法:

或使用直截了当的Option

myRDD.map(line=> if (condition) None else Some(somevalue))
    .flatten()

如果您想将最后一个选项与Try结合使用,请使用类似

的内容
myRDD.map(line=> Try{
           /*something dangerous*/ 
           if  (condition) None else Some(somevalue)
         })
   .collect{ case  Success(r) => r } // successful results
   .flatten() // flatten out the Nones

恕我直言(以及其他许多人),不要自己在scala中抛出异常。我认为它们是花哨的goto语句,它们不会在一个维度内跳过代码,而是通过不同的维度(即堆栈)。它们是Java平台的一部分,因此我们需要在访问Java代码时处理它们(如果构建将由Java开发人员使用的东西,则可能需要抛出一些代码)

答案 1 :(得分:2)

如果你忽略了实际错误,你可以只过滤条件(假设条件完全取决于行):

def condition(line: String): Boolean = ???

val myRDD = sc.textFile(path)
  .map(line => Try { // do something dangerous })
  .filter(_.isSuccess)
  .filter(condition)
  .map(_.get)