在Spark中,我可以这样处理异常:
val myRDD = sc.textFile(path)
.map(line => Try {
// do something dangerous
// if(condition)
// raise isFailure;
}).filter(_.isSuccess).map(_.get)
在某些情况下,我喜欢第一个map函数读取的元素也会引发失败。我该怎么做?
答案 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)