首页 > 解决方案 > org.apache.spark.sql.AnalysisException:没有这样的结构字段

问题描述

我正在使用 Java Spark 读取这样的镶木地板文件

Dataset<MyData> myDataDS = sparkSession.read().parquet(myParquetFile)
                        .as(Encoders.bean(MyData.class));

myParquetFile如果架构完全符合类,它工作正常MyData但是假设我向类添加一个新字段,例如myId(即使它的值为空),MyData那么我需要重新生成镶木地板文件,否则它会抛出类似的异常

引起:org.apache.spark.sql.AnalysisException: No such struct field myId

有没有一种方法可以跳过空值以通过此错误而不重新生成镶木地板文件?

标签: javaapache-sparkapache-spark-sql

解决方案


在读取 parquet 时,默认情况下,Spark 使用 parquet 文件中包含的模式来读取数据。例如,与 Avro 格式相反,模式位于 parquet 文件中,如果要更改模式,则必须重新生成 parquet 文件。

但是,您可以DataFrameReader使用方法将模式提供给 Spark,而不是让 Spark 推断模式.schema()。在这种情况下,Spark 将忽略 parquet 文件中定义的模式并使用您提供的模式。

因此,解决方案是将从您的铸造类中提取的模式传递给 Spark 的DataFrameReader

Dataset<MyData> myDataDS = sparkSession.read()
    .schema(Encoders.bean(MyData.class).schema())
    .parquet(myParquetFile)
    .as(Encoders.bean(MyData.class))

AnalysisException不会抛出,您会得到一个数据集,其中“myId”列设置为 null 。


推荐阅读