Hive列操作汇总(添加/更新/删除/虚拟列)
***注意:***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文件系统对应的存储路径及偏移量