在读取镶木地板文件时,出现异常:`线程“ main”中的异常org.apache.spark.sql.AnalysisException`

时间:2019-04-13 12:34:32

标签: java apache-spark parquet

我有一个员工数据在Hadoop中进行分区并存储在实木复合地板文件中。读取数据时,无法将分区列之一映射到Java POJO中,并给出以下异常。

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`year`' given input columns: [name, age, dob, address]; 

此代码是用Java编写的,雇员对象如下所示。

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
   private String name;
   private Integer age;
   private Timestamp dob;
   private String address;

   // Partition columns
   private Integer year;
   private Integer month;
   private Integer day;
}

我将此记录存储在实木复合地板文件中,并且在HDFS中对其进行了适当的分区。这意味着在实木复合地板文件记录中将不会存储year, month and day的分区列。

现在,我正在尝试使用以下代码读取作为JavaRDD的实木复合地板文件记录。

sparkSession.read()
    .parquet(stringArrOfParquetFileDirPaths) // e.g. /usr/warehouse/database.db/employee_table/year=1990/month=4/day=23/*.parquet
    .as(Encoders.bean(Employee.class))
    .javaRDD()
    .filter(Objects::nonNull);

但是,在这里,我得到了例外。

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`year`' given input columns: [name, age, dob, address]; 

据我所知,实木复合地板文件未在其中存储分区字段数据(我也通过在文本编辑器中打开来检查实木复合地板,这很难理解,但更容易猜测)。而且,当我尝试从实木复合地板文件中读取数据时,我相信Spark无法在记录中找到与year, month and day匹配的Employee.class数据,并且失败了。

此语句.as(Encoders.bean(Employee.class))

失败

在这种情况下,我们如何成功将记录读入JavaRDD?

0 个答案:

没有答案