我有一个包含项目ID的RDD。
我有一个转换,对于每个ID,转到数据库并获取完整的项目记录。
如果在数据库中找不到该项,则返回None
。
但是,有时我从DB获得超时异常。在这种情况下,我想中止flatMap而不是尝试访问每个项目的数据库(我假设如果我在一个项目上超时,我可能会在其余项目上获得相同的异常)。
我怎么能用火花来做这件事?
如果我从catch子句中调用return
,我会收到错误" Spark闭包中不允许返回语句"
val rdd = sc.textFile(filePath, 1)
rdd.flatMap(id => {
try {
Some(getItemFromDB(id))
} catch {
case e: com.mongodb.MongoTimeoutException =>
//Here I would like to abort the flatMap transformation and retry after waitine a period of time
case t: Throwable => None
}
})
我能做到的唯一优化是定义一个累加器= 0,它将保持从DB读取的状态。如果一个项目因超时而失败,则累加器增加1.在每次从DB读取之前,我们可以检查累加器的状态并尝试仅在accumulator = 0时读取。 但是,如果我没记错的话,火花累加器是"只写",所以这不会真的有效。