Hive查询报错:java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable

[复制链接]
发表于 2025-11-26 17:39:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
 
以下只是说一下办理思绪  供各人参考

以下基于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`(
  2.   `d_ip` string COMMENT 'dev_ip',
  3.   `p_user` string COMMENT 'primary_user')
  4. PARTITIONED BY (
  5.   `month` string,
  6.   `date` string)
  7. ROW FORMAT SERDE
  8.   'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
  9. STORED AS INPUTFORMAT
  10.   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
  11. OUTPUTFORMAT
  12.   'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
  13. LOCATION
  14.   '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的路径做变动 
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表