hive-修改表结构

31 篇文章 4 订阅

一、列的CRUD

增加或者替换列的语句如下,其中ADD COLUMNS在现有列之后但在分区列之前增加新列,REPLACE COLUMNS先删除现存列,然后再增加新列。替换列只能在表使用自带SerDe(DynamicSerDe,MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe)时使用。
CASCADE命令更改表更改列将更改表元数据的列,并将相同的更改级联到所有分区元数据

ALTER TABLE table_name 
ADD|REPLACE COLUMNS 
(col_name data_type [COMMENT col_comment], ...)

1. 增加列

一次增加一个列(默认添加为最后一列)
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');

2. 改变列名/类型/位置/注释

  1. 该命令将允许用户更改列的名称、数据类型、注释、位置或它们的任意组合,但必须先存在该字段才能修改名字及指定位置.
  2. 列更改命令只修改Hive的元数据,不修改数据。用户应该确保表/分区的实际数据布局符合元数据定义。
  3. 无论表或分区的保护模式如何,ALTER TABLE CHANGE COLUMN CASCADE子句都将覆盖表分区的列元数据。
ALTER TABLE table_name CHANGE
	[CLOUMN] col_old_name col_new_name column_type
	[CONMMENT col_conmment]
	[FIRST|AFTER column_name]
	[CASCADE|RESTRICT];
CREATE TABLE test_change (a int, b int, c int);
 
首先将列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 CHANGE
	[CLOUMN] col_old_name col_new_name column_type
	[CONMMENT col_conmment]
	[FIRST|AFTER column_name]
	[CASCADE|RESTRICT];

把列telephone改名为mobile、放到第1个、添加注释

alter table people 
change 
telephone mobile string comment 'change column name' 
first;

3. 删除列

注意:如果列字段比较多,可以用show create table table_name; 显示建表语句,将字段一次性复制进来,删除哪些字段就直接去除即可.
删除仅修改表的schema,但不删除数据。

原有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);

二、分区

1. 新增分区

在不存在分区列的表中会失败。列必须是分区列

ALTER TABLEtable_name 
ADD [IF NOT EXISTS] PARTITION 
partition_spec[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...
 
以上为节省空间,需要将partition_spec替换为:
(partition_col = partition_col_value, partition_col = partiton_col_value,...)

2. 重命名(移动)分区

ALTER TABLE table_name 
PARTITION partition_spec RENAME TO PARTITION partition_spec;

partition_spec:
(partition_col = partition_col_value, partition_col = partiton_col_value, ...)

example

alter table people 
partition(department='1',sex='0',howold=23) 
rename to 
partition(department='2',sex='1',howold=24);         

3. 表之间移动分区

将一个表的分区中的数据移动另一个拥有相同schema但没有那个分区的表中。

ALTER TABLE table_name_1 EXCHANGE PARTITION (partition_spec) WITH TABLE table_name_2;

4. 恢复分区(加载分区文件)(MSCKREPAIR TABLE)

Hive在元数据中为每个表维护一个分区列表,如果新分区直接添加到HDFS中,Hive不会更新分区列表。除非在每个新添加的分区上执行ALTER TABLE table_name ADD PARTITION
为了避免重复执行上述命令,可以使用如下的命令,该语句将把存在于HDFS上但还没有在元数据中注册的文件添加到hive表

MSCK REPAIR TABLE table_name;

example:

hive> dfs -mkdir /user/hive/warehouse/learning.db/people/department=1/sex=0/howold=23;
hive> show partitions people;
OK
department=2/sex=1/howold=24
Time taken:0.192 seconds, Fetched: 1 row(s)
hive> msck repair table people;
OK
Partitions notin metastore:     people:department=1/sex=0/howold=23
Repair: Addedpartition to metastore people:department=1/sex=0/howold=23
Time taken:0.943 seconds, Fetched: 2 row(s)
hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.397 seconds, Fetched: 2 row(s)

5. 删除分区

ALTER TABLE table_name 
DROP [IF EXISTS] PARTITION partition_spec,PARTITION partition_spec,...

删除并不存在的分区时不会提示错误信息
可以使用上述语句删除表的分区,该语句将会删除指定分区的数据和元数据。对于受NO DROP CASCADE的表,可以使用IGNORE PROTECTION删除指定的分区或一组分区,该语句如下:

ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec IGNORE PROTECTION;

example

hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.397 seconds, Fetched: 2 row(s)
hive> alter table people drop partition (department='2',sex='2',howold=24);
OK
Time taken:1.596 seconds
hive> show partitions people;
OK
department=1/sex=0/howold=23
department=2/sex=1/howold=24
Time taken:0.227 seconds, Fetched: 2 row(s)
hive> alter table people drop partition (department='2',sex='1',howold=24);
Dropped the partition department=2/sex=1/howold=24
OK
Time taken:2.267 seconds
hive> show partitions people;                                              
OK
department=1/sex=0/howold=23
Time taken:0.191 seconds, Fetched: 1 row(s)

三、表

1. 重命名

ALTER TABLE table_name RENAME TO new_table_name

2. 修改表的TBLPROPERTIES属性

使用该语句可以增加表的元数据,last_modified_by, last_modified_time属性自动被添加和管理,可以使用DESCRIBE EXTENDED table_name查询新增的表属性。

ALTER TABLE table_name 
SET TBLPROPERTIES 
(property_name = property_value, property_name = property_value,... )

3. 修改表的注释

要修改表的注释,只需要使用上面介绍的修改表属性语句,将property_name指定为’comment’ 属性即可:

ALTER TABLE table_name 
SET TBLPROPERTIES('comment' = new_comment);

4. 增加SerDe属性

该语句允许向SerDe对象增加自定义的元数据。SerDe属性在SerDe被Hive初始化时传递给表的SerDe。

ALTER TABLE table_name 
SET SERDE serde_class_name [WITH SERDEPROPERTIES serde_properties]

ALTER TABLE table_name 
SET SERDEPROPERTIES 
(property_name = property_value,property_name = property_value, ... )

5. 修改表的存储属性

该语句改变表的物理存储属性。
需要注意的时,上述修改表的语句仅修改表的Hive的元数据,不会重新组织或者重新格式化现存数据,用户需要确定实际的数据布局符合元数据的定义。

ALTER TABLE table_name 
CLUSTEREDBY (col_name, col_name, ...) 
[SORTED BY (col_name, ...)] 
INTO num_buckets BUCKETS
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值