如何正确处理spark.sql.AnalysisException

时间:2018-07-01 15:43:23

标签: java apache-spark exception-handling distributed-computing apache-spark-dataset

我一直在使用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))));

1 个答案:

答案 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
    }
}

注意:就我而言,我还针对必须处理的特定异常(即“路径不存在”)测试了错误消息的内容,在这种情况下,我返回了一个空数据集,而不是抛出另一个异常。我一直在寻找更好的解决方案,却碰巧来到了这里...