大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
hive升级过程中异常记录-java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct cannot be cast to org.apache.hadoop.io.BinaryComparable
常规ClassCastException问题梳理-来源网络
Caused by: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.hive.ql.io.orc.OrcSerde$OrcSerdeRow
问题原因通常是:表的inputformat 和 outputformat 是 orc,而序列化serde不是orc
参看表结构命令:desc formatted 表名;
修改命令如下:ALTER TABLE 表名 SET FILEFORMAT ORC;
以后创建orc表的时候 指定orc的方式如下:
STORED AS ORC
tblproperties ('orc.compress'='SNAPPY');
Refer:https://www.cnblogs.com/xjh713/p/10137880.html
hive迁移过程中出现的ClassCastException问题-排查
Diagnostic Messages for this Task:
Error: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable {175101, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:157)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:465)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:349)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1875)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing writable {175101, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null}
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:492)
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:148)
... 8 more
Caused by: java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct cannot be cast to org.apache.hadoop.io.BinaryComparable
at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.doDeserialize(LazySimpleSerDe.java:151)
at org.apache.hadoop.hive.serde2.AbstractEncodingAwareSerDe.deserialize(AbstractEncodingAwareSerDe.java:76)
at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.readRow(MapOperator.java:125)
at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.access$200(MapOperator.java:89)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:483)
... 9 more
FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
表现:
1. select 分区表各分区数据都正常;
2. join 分区表各分区,有的分区成功,有的分区报上面的异常;
3. 查看表的serde 确实是orc模式;
4. 查看分区serde 不是orc模式 --- 报错的主要原因;
查看分区格式命令: desc formatted dw.user_first_fee_smb partition(log_date="2021-02-19");
根据测试,如果想把该分区的serde修改为orc模式,可以在 cli客户端使用 insert overwrite 模式
insert overwrite table dw.user_first_fee_smb partition(log_date) select * from dw.user_first_fee_smb where log_date="2021-02-19";
但是有哪些表的那些分区需要修改呢,到hive的元数据库查询如下:
select LOCATION,PART_NAME,t.TBL_NAME,INPUT_FORMAT,SLIB
from PARTITIONS a, SERDES b,SDS c ,TBLS t
where a.SD_ID=c.SD_ID and c.SERDE_ID=b.SERDE_ID and t.TBL_ID=a.TBL_ID
and OUTPUT_FORMAT='org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' and SLIB<>'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
;
然后把这些表的这些分区,重新创建或 insert overwrite一下就ok了。
分析
表最开始创建 没有使用STORED AS ORC 模式,而 serde又没有指定,后续修改了表的格式为ALTER TABLE 表名 SET FILEFORMAT ORC;
但是已经存在的分区,并没有跟随而被修改。所以导致了分区和表的 serde不一致的情况。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195656.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...