博客 / 詳情

返回

Hive查詢報錯:java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.LongWritable

 

以下只是説一下解決思路  供大家參考

以下基於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表

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路徑,同時把字段改為符合要求的類型

 

然後刷新所有分區  

MSCK REPAIR TABLE ddm.op_111102;

刷新某個分區

 ALTER TABLE op_111102 ADD PARTITION (month=202511, date='08');

以上是為了加載查詢數據 

 

這樣先查詢下創建的表是否能夠查詢刷新分區的數據

select * from 表 ;

這個主要驗證是否可以查詢到數據,如果可以的話 那説明基本可以了

 

剩下的就是把表名重命名下就可以了 把原本有問題的表名換一個,然後這種可以用的表名 重命名為原來的表名即可 (如果需要的話)

ALTER TABLE db.old_name RENAME TO db.new_name;

對應外部表來説 需要改名 不會對Location的路徑做變更 

 

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.