用户类抛出异常:org.apache.spark.sql.AnalysisException:无法推断 Parquet 的架构。必须手动指定

Posted

技术标签:

【中文标题】用户类抛出异常:org.apache.spark.sql.AnalysisException:无法推断 Parquet 的架构。必须手动指定【英文标题】:User class threw exception: org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually 【发布时间】:2021-12-29 06:27:12 【问题描述】:

我正在实现一个 spark java 代码, 数据集输入 = spark.read().parquet(configuration.getInputDataLocation());

但是 inputDataLocation(Azure 存储帐户容器中的文件夹)可能没有任何数据,在这种用例中会抛出异常, 。

有没有一种简单的方法可以预先检查文件夹是否为空,然后只有我处理上面写的spark java代码行。

【问题讨论】:

欢迎来到 SO!确保您阅读好帖子的指南并编辑您的帖子。你会想要一个更短的标题,一个更清晰的描述,包括代码格式,以及对你所做的事情的清晰解释,包括代码。如果您不这样做,其他用户可能(并且将会!)否决您的问题…… 【参考方案1】:

你为什么不尝试读取输入目录来检查它是否存在?

       final boolean exists;
            try 
                exists = file.getFileSystem(spark.sparkContext().hadoopConfiguration()).getFileStatus(file).isFile();

//exists = dir.getFileSystem(spark.sparkContext().hadoopConfiguration()).listStatus(dir).length // (0 length is an empty dir)
             catch (IOException e) 
                throw new UncheckedIOException(e);
            
    
            if (exists) 
                return spark.read().parquet(configuration.getInputDataLocation());
             else 
                LOG.warn("File directory '' does not exist", file);
                return spark.emptyDataset(SOME_ENCODER);
            
        

【讨论】:

实例文件是指java.io.File吗?因为它需要在其内部传递一个参数,并且它没有任何名为 getFileSystem(); 文件是来自 org.apache.hadoop.fs.Path 的Path 的一个实例; 嘿,我测试了你的解决方案,如果提供了确切的文件路径,它工作正常,但在这里我想检查指定文件夹中是否有文件以及我们如何做。跨度> 在代码中添加注释以读取目录

以上是关于用户类抛出异常:org.apache.spark.sql.AnalysisException:无法推断 Parquet 的架构。必须手动指定的主要内容,如果未能解决你的问题,请参考以下文章

Spark AnalysisException 未找到全局表或视图

ContentDisposition 类抛出不一致的异常

如何使用 Aspectj 捕获和抑制 Java 类抛出的异常

Ninject - 如何在构造过程中识别哪个类抛出异常

Apache Spark 2.4.0、AWS EMR、Spark Redshift 和 User 类抛出异常:java.lang.AbstractMethodError

Spark 作业抛出“org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [120 seconds]”