我有一个员工数据在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?