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

使用spark和scala进行有效的异常处理,scala,apache-spark,Scala,Apache Spark,我知道这个问题并不是什么新鲜事,但我的背景不同。我一直在尝试最好的方法来有效地处理异常。下面是我的实验代码 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 } v

我知道这个问题并不是什么新鲜事,但我的背景不同。我一直在尝试最好的方法来有效地处理异常。下面是我的实验代码

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个转换中的任何一个中得到错误。所以我正在尝试筛选成功的结果,并将其传递到下一个阶段。那么,上述方法是有效的异常处理方法还是推荐的其他替代方法

更好的方法:

val res: RDD[Int] = rdd.flatMap(x => Try(x.toInt).map(i => i * i).toOption)
它确实实现了你想要实现的目标。怎么做

  • 每个
    字符串
    都转换为
    Int
    Try(x.toInt)
  • 如果转换成功,则整数将自身相乘:
    map(i=>i*i)
  • 如果
    Try[Int]
    Failure
    并且
    Some(value)
    否则:
    toOption
  • 由于
    flatMap
    操作,只有定义的
    选项[Int]
    (即不
    None
    ,因此转换成功)保留在结果的
    RDD[Int]

  • 不需要额外的过滤器和
    issucess
    调用。

    如果要使用数据帧及其sql表达式,并且由于数据原因存在此类运行时异常,该怎么办。有没有办法处理同样的问题?