找回密码
 立即注册
首页 业界区 安全 Hive查询报错:java.lang.ClassCastException: org.apac ...

Hive查询报错:java.lang.ClassCastException: org.apache.hadoop.io.

院儿饯 2025-11-17 20:20:16
 
以下只是说一下解决思路 供大家参考

以下基于hive的外部表
 
Error: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable (state=,code=0)
 
这个是因为hdfs的存的文件和hive元数据的建表语句对应的字段类型不一样,hdfs文件是字符串类型,但是hive的表字段是数值类型 转换报错了
首先判断一下是哪个字段转换的问题,这个大家自行比较 ,有一个简单的办法就是单独查询每一个字段,
比如 select 字段 from 表;  单独查询一个字段是不会报异常的 如果报了 说明就是那个字段有问题
 
这个时候我们试过把hive对应的字段的数值类型直接转换成字符串类型(我们试过 但是这种方法即使把hive的字段改为字符串类型了 查询也还是不行 
这种数值转字符串类型hive是支持直接转换了但是比如字符串转数值类型 就不行
 
最后做法
新建一个字段类型符合hdfs要求的hive表
  1. CREATE TABLE `ddm.op_111102`( `d_ip` string COMMENT 'dev_ip', `p_user` string COMMENT 'primary_user') PARTITIONED BY ( `month` string, `date` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 'hdfs://apps/op'
复制代码
以上就是一个简单的建表语句 根据自己的来就行
最主要的就是要把外部表的Location设置为之前对应表有问题的hdfs路径,同时把字段改为符合要求的类型
 
然后刷新所有分区  
  1. MSCK REPAIR TABLE ddm.op_111102;
复制代码
刷新某个分区
  1. ALTER TABLE op_111102 ADD PARTITION (month=202511, date='08');
复制代码
以上是为了加载查询数据 
 
这样先查询下创建的表是否能够查询刷新分区的数据
select * from 表 ;
这个主要验证是否可以查询到数据,如果可以的话 那说明基本可以了
 
剩下的就是把表名重命名下就可以了 把原本有问题的表名换一个,然后这种可以用的表名 重命名为原来的表名即可 (如果需要的话)
  1. ALTER TABLE db.old_name RENAME TO db.new_name;
复制代码
对应外部表来说 需要改名 不会对Location的路径做变更 
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册