問題描述
今天在創建hive分區表的時候,有一個字段類型創建錯誤,本來應該是string,但是一不小心創建了int類型,然後經過alter修改修改字段類型後,查詢的時候,發現字段仍然不能正常顯示。下面,對問題的處理過程進行一個詳細的描述和介紹。
三種方式
- 表或者分區刪除重新創建(數據無價,注意數據)
- 在alter中指定分區(只會在指定的分區生效)
- 在alter語句末尾添加cascade
-- 1.分區刪除重新創建
alter table t_pv_log2 change staylong staylong string;
alter table t_pv_log drop partition(day='2020-04-03');
alter table t_pv_log drop partition(day='2020-04-03');
-- 2.在alter中指定分區,需要每個分區都執行
alter table t_pv_log partition(day='2020-04-03') change staylong staylong string;
-- 3.在alter語句末尾添加cascade
alter table t_pv_log change staylong staylong string cascade;
處理過程
- 錯誤的建表語句
0: jdbc:hive2://master:10000> create table t_pv_log(ip string, url string, staylong int) partitioned by (day string) row format delimited fields terminated by ',';
- 數據內容格式如下:
192.168.22.1,http://master:50070/a,2020/4/3 10:15
192.168.22.6,http://master:50075/a,2020/4/3 10:15
192.168.22.11,http://master:50080/a,2020/4/3 10:15
最後面的時間,應該是string類型的。
- 然後執行了上傳數據操作
0: jdbc:hive2://master:10000> load data local inpath '/home/gugu/testdata/tmpdat a/pv.log.2020-0403' into table t_pv_log partition(day='2020-04-03');
- 數據查詢
0: jdbc:hive2://master:10000> select * from t_pv_log;
- 發現staylong列全是null,心中猜想數據有錯吧?對比了下數據,發現數據沒有異常
查看下錶結構
0: jdbc:hive2://master:10000> desc t_pv_log;
- 發現問題
問題就是數據列類型不對,那就進行修改吧
0: jdbc:hive2://master:10000> alter table t_pv_log change staylong staylong string;
順序確認下修改是不是成功了(這是個好習慣,修改後確定自己的操作😁)。
-
然後繼續查看
問題依舊,數據依舊顯示NULL
心一萬個神獸在奔騰,這是什麼鬼 -
爲了排除是數據的問題,我將數據刪除的剩餘一行,添加新分區,實在不行我就只能新建表了呀。
數據內容:
192.168.22.1,http://master:50070/a,2020/04/03 10:15
0: jdbc:hive2://master:10000> alter table t_pv_log add partition(day='2020-04-06');
[gugu@master tmpdata]$ hdfs dfs -put -f pv.log.2020-0406 /user/hive/warehouse/test_db.db/t_pv_log/day=2020-04-06/
0: jdbc:hive2://master:10000> select * from t_pv_log where day='2020-04-06';
新建的好了,心中還是很疑惑。難道沒有實時生效?
- 那我就先刪除分區再新建一個分區吧
0: jdbc:hive2://master:10000> alter table t_pv_log drop partition(day='2020-04-03');
0: jdbc:hive2://master:10000> alter table t_pv_log add partition(day='2020-04-03');
0: jdbc:hive2://master:10000> select * from t_pv_log where day='2020-04-03';
難道我就只能這樣了?把所有分區刪掉重建?😂難道這麼坑的嗎?
- 從我 萬能的度娘和谷歌查找下有麼有這個問題
找個了兩種方式
1.刪除分區重建分區。
2.在alter的時候指定分區
下面演示第二種
0: jdbc:hive2://master:10000> alter table t_pv_log partition(day='2020-04-04') change staylong staylong string;
實測可用。
- 但是還是覺得上面兩種方式很扯,繼續找度娘谷歌聊天。
發現了第三種,在修改表的結構的時候添加cascade
注:此處t_pv_log2與t_pv_log數據一致,t_pv_log2的staylong仍然爲int,因爲我想修改t_pv_log的字段爲int的時候發現修改失敗了,失敗原因就不做此文重點。
0: jdbc:hive2://master:10000> alter table t_pv_log2 change staylong staylong string cascade;
0: jdbc:hive2://master:10000> select * from t_pv_log2;
到此算是結束了吧,又一次解決問題😎