***注意:***REPLACE列 替換所有現有列,只更改表的模式,而不是數據。表必須使用本機SerDe。REPLACE列 還可以用於從表的模式中刪除列.
添加字段
一次增加一個列(默認添加為最后一列)
ALTER TABLE table_name ADD COLUMNS (new_col INT);
可以一次增加多個列
ALTER TABLE table_name ADD COLUMNS (c1 INT,c2 STRING);
添加一列並增加列字段注釋
ALTER TABLE table_name ADD COLUMNS (new_col INT COMMENT 'a comment');
改變列名/類型/位置/注釋
ALTER TABLE table_name CHANGE
[CLOUMN] col_old_name col_new_name column_type
[CONMMENT col_conmment]
[FIRST|AFTER column_name]
[CASCADE|RESTRICT];
該命令將允許用戶更改列的名稱、數據類型、注釋、位置或它們的任意組合,但必須先存在該字段才能修改名字及指定位置.
列更改命令只修改Hive的元數據,不修改數據。用戶應該確保表/分區的實際數據布局符合元數據定義。
無論表或分區的保護模式如何,ALTER TABLE CHANGE COLUMN CASCADE子句都將覆蓋表分區的列元數據。使用自由裁量權。
// 首先將列a的名稱更改為a1:
ALTER TABLE test_change CHANGE a a1 INT;
//將列a1的名稱更改為a2,將其數據類型更改為字符串,並將其放在列b之后:
ALTER TABLE test_change CHANGE a1 a2 STRING AFTER b;
注意:列位置更換后數據位置還是不動的,若想讓數據跟着字段一起移動,需更新表數據,
使用insert overwrite table 從表中將移動之前對應的數據插入到移動之后對應的字段中
// 新表的結構是:
b int, a2 string, c int.
// 然后將c列的名稱改為c1,並將其作為第一列:
ALTER TABLE test_change CHANGE c c1 INT FIRST;
// 此時新表的結構是:
c1 int, b int, a2 string.
添加/更新列
ALTER TABLE table_name
[PARTITION partition_spec] -- (Note: Hive 0.14.0 and later)
ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
[CASCADE|RESTRICT] -- (Note: Hive 1.1.0 and later)
添加列允許您在現有列的末尾,但在分區列之前添加新列。對於Avro支持的表、Hive 0.14和更高版本,也支持這種方法。
REPLACE列刪除所有現有列並添加新的列集。這只能用於具有本機SerDe的表(DynamicSerDe、元數據類型pedcolumnsetserde、LazySimpleSerDe和ColumnarSerDe)。REPLACE列還可以用於刪除列。
刪除列示例:
原有Hive表test_change中有a,b,c,d,e這幾個字段
將從test_change中刪除“d”列:
ALTER TABLE test_change REPLACE COLUMNS (a int, b int,c string,e string);
將d和e兩列一起刪除:
ALTER TABLE test_change REPLACE COLUMNS (a int, b int,c string);
注意:如果列字段比較多,可以用show create table table_name; 顯示建表語句,將字段一次性復制進來,刪除哪些字段就直接去除即可.
Hive表中的虛擬(隱藏)列:
在hive中直接可以直接使用的列,無需創建
INPUT__FILE__NAME: maptask中的輸入文件
BLOCK__OFFSET__INSIDE__FILE: 記錄在文件中的偏移量
示例:
SELECT carid,
carbrand,
INPUT__FILE__NAME ,
BLOCK__OFFSET__INSIDE__FILE
from test.car_info
ORDER BY carid desc
limit 50;
該虛擬列可用於查找數據在hdfs文件系統對應的存儲路徑及偏移量