Java 如何正确处理spark.sql.AnalysisException

Java 如何正确处理spark.sql.AnalysisException,java,apache-spark,exception-handling,distributed-computing,apache-spark-dataset,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.explo

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

在scala中,您只需将调用包装在
Try
中并管理失败。比如:

val result = Try(executeSparkCode()) match {
    case s: Success(_) => s;
    case Failure(error: AnalysisException) => Failure(new MyException(error));
}
注1:如果您的问题暗示如何在scala中管理异常,那么关于这个主题有很多文档和帖子(即不要抛出)。例如,您可以检查

注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
    }
}

注意:在本例中,我还测试了错误消息的内容,以确定我必须管理的特定异常(即“路径不存在”),在这种情况下,我返回一个空数据集,而不是引发另一个异常。我正在寻找一个更好的解决方案,碰巧来到这里…

如果被发现,你会怎么做?将异常包装在我的一个自定义异常中,然后从那里抛出,以便调用对象使用它来处理异常,但实际上,这并不意味着停止、修复和重新运行。这是我的重点。嗯,是的,这是一种方法,但是用我自己的异常包装这样的运行时异常是一个好主意??不,没有争议-这很好,但结果是,我们可能仍然需要在修复后重新运行。至少在BI&DWH中,情况一直如此。嗨。这是一段时间前,当我开始作为一个刚毕业的大学生在我的第一份工作。我使用了一个多捕获,最后一个捕获是异常类。它已经在prod上运行了相当长的一段时间了,当出现问题时,它会给出相当不错的信息/堆栈跟踪。我正在尝试/捕获一个
try{/*spark dataframe filtering query*/}catch{case e e:Throwable=>println(e.getMessage)}
并看到它仍然抛出
AnalysisException
和崩溃:(这不是一个可丢弃的
吗?
?从您所说的来看,它应该可以工作。可能问题在其他地方,但我需要查看更多代码才能知道。您是否检查了stacktrace以确保在try/catch中引发异常?例如:spark很懒,调用action方法(write、collect)时出错,即使问题在筛选器调用中,也不在筛选器调用中