我一直在使用Spark Dataset API对JSON执行操作,以根据需要提取某些字段。但是,当我提供的用于让spark知道要提取哪个字段的规范出错时,spark会吐出一个
org.apache.spark.sql.AnalysisException
在这样的分布式处理方案中如何处理未经检查的运行时异常?我知道抛出try-catch可以使事情分类,但是处理这种情况的推荐方法是什么
dataset = dataset.withColumn(current, functions.explode(dataset.col(parent + Constants.PUNCTUATION_PERIOD + child.substring(0, child.length() - 2))));
答案 0 :(得分:1)
在scala中,您只需将呼叫包装在Try
中并管理失败。像这样:
val result = Try(executeSparkCode()) match {
case s: Success(_) => s;
case Failure(error: AnalysisException) => Failure(new MyException(error));
}
注1:如果您的问题涉及如何在Scala中管理异常,则有很多关于此主题的文档和帖子(即不要抛出)。例如,您可以检查that answer (of mine)
注意2:我这里没有scala开发环境,因此我没有测试此代码)
但是,在Java中有一个棘手的情况:编译器不会期望未经检查的AnalysisException,因此您不能专门捕获此异常。可能是一些scala / java误解,因为scala不跟踪检查的异常。我所做的是:
try{
return executeSparkCode();
} catch (Exception ex) {
if(ex instanceOf AnalysisException){
throw new MyException(ex);
} else {
throw ex; // unmanaged exceptions
}
}
注意:就我而言,我还针对必须处理的特定异常(即“路径不存在”)测试了错误消息的内容,在这种情况下,我返回了一个空数据集,而不是抛出另一个异常。我一直在寻找更好的解决方案,却碰巧来到了这里...