以下只是説一下解決思路 供大家參考
以下基於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的路徑做變更