Hadoop之Hive分區表alter字段類型字段解析沒有改變

Hive分區表alter字段類型字段解析沒有改變

問題描述

今天在創建hive分區表的時候,有一個字段類型創建錯誤,本來應該是string,但是一不小心創建了int類型,然後經過alter修改修改字段類型後,查詢的時候,發現字段仍然不能正常顯示。下面,對問題的處理過程進行一個詳細的描述和介紹。

三種方式

  1. 表或者分區刪除重新創建(數據無價,注意數據)
  2. 在alter中指定分區(只會在指定的分區生效)
  3. 在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;

處理過程

  1. 錯誤的建表語句
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 ',';
  1. 數據內容格式如下:
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類型的。

  1. 然後執行了上傳數據操作
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');

在這裏插入圖片描述

  1. 數據查詢
0: jdbc:hive2://master:10000> select * from t_pv_log;

在這裏插入圖片描述

  1. 發現staylong列全是null,心中猜想數據有錯吧?對比了下數據,發現數據沒有異常
    查看下錶結構
0: jdbc:hive2://master:10000> desc t_pv_log;

在這裏插入圖片描述

  1. 發現問題
    問題就是數據列類型不對,那就進行修改吧
0: jdbc:hive2://master:10000> alter table t_pv_log change staylong staylong string;

順序確認下修改是不是成功了(這是個好習慣,修改後確定自己的操作😁)。
在這裏插入圖片描述

  1. 然後繼續查看
    問題依舊,數據依舊顯示NULL
    在這裏插入圖片描述
    心一萬個神獸在奔騰,這是什麼鬼

  2. 爲了排除是數據的問題,我將數據刪除的剩餘一行,添加新分區,實在不行我就只能新建表了呀。
    數據內容:

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';

在這裏插入圖片描述
新建的好了,心中還是很疑惑。難道沒有實時生效?

  1. 那我就先刪除分區再新建一個分區吧
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. 從我 萬能的度娘和谷歌查找下有麼有這個問題
    找個了兩種方式
    1.刪除分區重建分區。
    2.在alter的時候指定分區

下面演示第二種

0: jdbc:hive2://master:10000> alter table t_pv_log partition(day='2020-04-04') change staylong staylong string;

在這裏插入圖片描述
實測可用。

  1. 但是還是覺得上面兩種方式很扯,繼續找度娘谷歌聊天。
    發現了第三種,在修改表的結構的時候添加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;

在這裏插入圖片描述
到此算是結束了吧,又一次解決問題😎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章