Spark-Scala 无法推断架构(将输入路径验证推迟到数据源中)

Posted

技术标签:

【中文标题】Spark-Scala 无法推断架构(将输入路径验证推迟到数据源中)【英文标题】:Spark-Scala Unable to infer schema (Defer input path validation into DataSource) 【发布时间】:2018-11-11 12:23:52 【问题描述】:

SPARK-26039

加载空的兽人文件夹时。无论如何要绕过这个。

val df = spark.read.format("orc").load(orcFolderPath)

org.apache.spark.sql.AnalysisException: Unable to infer schema for ORC. It must be specified manually.;
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:185)
  at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$7.apply(DataSource.scala:185)
  at scala.Option.getOrElse(Option.scala:121)
  at org.apache.spark.sql.execution.datasources.DataSource.getOrInferFileFormatSchema(DataSource.scala:184)
  at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:373)
  at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
  at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
  ... 49 elided

得到这个错误可能是兽人阅读器试图推断架构,但我想绕过这个特殊情况,因为在存储库空白文件夹中以某种方式出现但必须检查。

try 
    spark.read.format("orc").load(path)
     catch 
        case ex: org.apache.spark.sql.AnalysisException => 
        null
            
    

尝试通过这种方式捕获异常。任何其他方式都会有所帮助

【问题讨论】:

将此代码放在单独的函数中。如果函数捕获此异常,请更改类级别的变量值或标志。 @Nikhil...我不想使用 try catch。但是如果有空文件夹,总会有异常......所以想要另一种方法...... 【参考方案1】:

似乎还有一个解决方案......这也不是最好的......

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.FileSystem, Path

  def pathStatus(path: String): Boolean = 
      val config: Configuration = new Configuration()
      val fs: FileSystem = FileSystem.get(config)
    if (fs.globStatus(new Path(path)) == null) 
      false
     else 
      true
    
  

【讨论】:

以上是关于Spark-Scala 无法推断架构(将输入路径验证推迟到数据源中)的主要内容,如果未能解决你的问题,请参考以下文章

Azure Databricks 将 JSON 数据写入 Parquet 文件引发错误:TypeError:无法推断类型的架构

近似推断

加载 Parquet 文件时无法推断架构

从 Spark 连接到 Redshift 时无法推断架构

创建 Spark DataFrame。无法推断类型的架构:<type 'float'>

numpy 引发错误:TypeError:无法推断类型的架构:<class 'numpy.float64'>