Hive中沒有直接刪除字段的操作,只有 Add/Replace
做個測試:
1)建表操作
create table if not exists temp.test1( applseq string comment '申請號' ,data_dt string comment '日期' ,flag string comment '標識' ,age decimal(20,6) comment '年齡' ,money_all decimal(20,6) comment 'money' ) comment '測試表temp1' partitioned by ( table_name varchar(50) comment '表名稱' ,dt varchar(8) comment '數據日期' ) stored as textfile;
2)用Hive查看表結構
hive> desc temp.test1; applseq string data_dt string flag string age decimal(20,6) money_all decimal(20,6) table_name varchar(50) dt varchar(8)
3)往表里插入數據
insert into temp.test1 values('B20220125CDE','20220125','',25,999999999,'sh001_sh001_jiebei_test1','20220125');
4)查看具體文件內容
[zw@hadoop ~]$ hdfs dfs -cat /user/hive/warehouse/temp.db/test1/table_name=sh001_sh001_jiebei_test1/dt=20220125/000000_0 B20220125CDE2022012525.000000999999999.000000
5)修改字段(刪除后兩個字段)
alter table temp.test1 replace columns ( applseq string comment '申請號' ,data_dt string comment '日期' ,flag string comment '標識') ;
6)查看字段
hive> desc temp.test1; OK applseq string data_dt string flag string table_name varchar(50) dt varchar(8)
7)查詢數據 (字段已經去掉)
hive> select * from temp.test1; OK B20220125CDE 20220125 sh001_sh001_jiebei_test1 20220125
8)查看具體文件內容(文件內容是沒有變的)
[zw@hadoop ~]$ hdfs dfs -cat /user/hive/warehouse/shdata.db/sh001_sh001_jiebei_test1/table_name=sh001_sh001_jiebei_test1/dt=20220125/000000_0 B20220125CDE2022012525.000000999999999.000000
總結一下:
1)可以用Hive刪除字段,會有很大的局限性:
只能刪除最后的幾個字段,這樣不會錯位
如果replace中間的字段,這樣會錯位
因為數據后台的數據文件不會改變,如果replace中間的字段,查詢只會拉取對應字段個數的后台數據文件里的字段值
官方寫的比較清楚:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns