使用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表达式,并且由于数据原因存在此类运行时异常,该怎么办。有没有办法处理同样的问题?