首页 > 解决方案 > Spark 无法读取具有不同版本架构的数据文件的 Hive ORC 表

问题描述

我有一个如下创建的配置单元 ORC 分区表。

create table default.tab_xyz (
wid String,
update_at timestamp,
type String,
id long)
 PARTITIONED BY (                                                                      
   minorversion string)                           
 ROW FORMAT SERDE                                   
   'org.apache.hadoop.hive.ql.io.orc.OrcSerde'      
 STORED AS INPUTFORMAT                              
   'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'  
 OUTPUTFORMAT                                       
   'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'

现在分区下有2.1和2.2两个版本。当我从版本文件中获取架构时,如下所示。

* 2.1 版本架构 *

wid : String,
type: String,
update_at : timestamp

* 2.2 版本架构 *

wid : String,
update_at : timestamp,
type: String,
id : long

当我执行 select * from default.tab_xyzin hive 时,它​​工作正常。

但是当我这样做时, spark.sql("select * from default.tab_xyz")它会抛出错误 java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.orc.mapred.OrcTimestamp,因为对于 2.1 版本的文件,它会将列映射 type到表中的 update_at列。

即使架构不同,是否仍然在 spark 中处理它以获取所有数据。

标签: apache-sparkhadooporc

解决方案


推荐阅读