修改表

描述

ALTER TABLE 语句更改表的结构或属性。

重命名

ALTER TABLE RENAME TO 语句更改数据库中现有表的名称。表重命名命令不能用于将表在数据库之间移动,只能在同一数据库中重命名表。

如果表被缓存,命令将清除表的缓存数据。下次访问表时,缓存将被延迟填充。此外:

语法

ALTER TABLE table_identifier RENAME TO table_identifier
ALTER TABLE table_identifier partition_spec RENAME TO partition_spec

参数

添加列

ALTER TABLE ADD COLUMNS 语句将提到的列添加到现有表中。

语法

ALTER TABLE table_identifier ADD COLUMNS ( col_spec [ , ... ] )

参数

删除列

ALTER TABLE DROP COLUMNS 语句从现有表中删除提到的列。注意,此语句仅支持 v2 表。

语法

ALTER TABLE table_identifier DROP { COLUMN | COLUMNS } [ ( ] col_name [ , ... ] [ ) ]

参数

重命名列

ALTER TABLE RENAME COLUMN 语句用于更改现有表的列名。注意,此语句仅在v2表中受支持。

语法

ALTER TABLE table_identifier RENAME COLUMN col_name TO col_name

参数

修改或变更列

ALTER TABLE ALTER COLUMN ALTER TABLE CHANGE COLUMN 语句更改列的定义。

语法

ALTER TABLE table_identifier { ALTER | CHANGE } [ COLUMN ] col_name alterColumnAction

参数

替换列

ALTER TABLE REPLACE COLUMNS 语句删除所有现有列并添加新的列集。注意,此语句仅支持 v2 表。

语法

ALTER TABLE table_identifier [ partition_spec ] REPLACE COLUMNS
[ ( ] qualified_col_type_with_position_list [ ) ]

参数

添加和删除分区

添加分区

ALTER TABLE ADD 语句将分区添加到分区表。

如果表被缓存,该命令将清除表及所有引用它的依赖项的缓存数据。缓存将在下次访问表或依赖项时懒惰地填充。

语法
ALTER TABLE table_identifier ADD [IF NOT EXISTS]
( partition_spec [ partition_spec ... ] )
参数

删除分区

ALTER TABLE DROP 语句删除表的分区。

如果表被缓存,该命令将清除表及其所有引用的依赖项的缓存数据。缓存将在下次访问表或依赖项时懒惰地填充。

语法
ALTER TABLE table_identifier DROP [ IF EXISTS ] partition_spec [PURGE]
参数

设置和取消设置

设置表属性

ALTER TABLE SET 命令用于设置表属性。如果某个特定属性已经被设置,这将用新值覆盖旧值。

ALTER TABLE UNSET 用于删除表属性。

语法
-- 设置表属性 
ALTER TABLE table_identifier SET TBLPROPERTIES ( key1 = val1, key2 = val2, ... )
-- 取消设置表属性
ALTER TABLE table_identifier UNSET TBLPROPERTIES [ IF EXISTS ] ( key1, key2, ... )

设置 SERDE

ALTER TABLE SET 命令用于在 Hive 表中设置 SERDE 或 SERDE 属性。如果某个特定属性已经设置,这将用新值覆盖旧值。

语法
-- 设置 SERDE 属性
ALTER TABLE table_identifier [ partition_spec ]
SET SERDEPROPERTIES ( key1 = val1, key2 = val2, ... )
ALTER TABLE table_identifier [ partition_spec ] SET SERDE serde_class_name
[ WITH SERDEPROPERTIES ( key1 = val1, key2 = val2, ... ) ]

设置位置和设置文件格式

ALTER TABLE SET 命令也可以用于更改现有表的文件位置和文件格式。

如果表被缓存, ALTER TABLE .. SET LOCATION 命令会清除表及其所有相关依赖项的缓存数据。当下次访问表或依赖项时,缓存将会被懒惰地填充。

语法
-- 更改文件格式
ALTER TABLE table_identifier [ partition_spec ] SET FILEFORMAT file_format
-- 更改文件位置
ALTER TABLE table_identifier [ partition_spec ] SET LOCATION 'new_location'

参数

恢复分区

ALTER TABLE RECOVER PARTITIONS 语句恢复表目录中的所有分区并更新 Hive metastore。 恢复分区的另一种方法是使用 MSCK REPAIR TABLE

语法

ALTER TABLE table_identifier 恢复 分区

参数

示例

-- 重命名表 
DESC student;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE Student RENAME TO StudentInfo;
-- 重命名表后
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- 重命名分区
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=10|
| age=11|
| age=12|
+---------+
ALTER TABLE default.StudentInfo PARTITION (age='10') RENAME TO PARTITION (age=);
-- 重命名分区后
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
-- 向表中添加新列
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo ADD columns (LastName string, DOB timestamp);
-- 添加新列到表后
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| LastName| string| NULL|
| DOB|timestamp| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- 删除表的列
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| LastName| string| NULL|
| DOB|timestamp| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo DROP columns (LastName, DOB);
-- 在删除表的列后
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- 重命名表的一列
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| name| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo RENAME COLUMN name TO FirstName;
-- 在重命名表的一列后
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| FirstName| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
-- ALTER 或更改列
DESC StudentInfo;
+-----------------------+---------+-------+
| col_name|data_type|comment|
+-----------------------+---------+-------+
| FirstName| string| NULL|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type|comment|
| age| int| NULL|
+-----------------------+---------+-------+
ALTER TABLE StudentInfo ALTER COLUMN FirstName COMMENT "新评论";
-- 在ALTER或更改列后
DESC StudentInfo;
+-----------------------+---------+-----------+
| col_name|data_type| comment|
+-----------------------+---------+-----------+
| FirstName| string|new comment|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type| comment|
| age| int| NULL|
+-----------------------+---------+-----------+
-- 替换列
DESC StudentInfo;
+-----------------------+---------+-----------+
| col_name|data_type| comment|
+-----------------------+---------+-----------+
| FirstName| string|new comment|
| rollno| int| NULL|
| age| int| NULL|
|# 分区 信息| | |
| # col_name|data_type| comment|
| age| int| NULL|
+-----------------------+---------+-----------+
ALTER TABLE StudentInfo REPLACE COLUMNS (name string, ID int COMMENT '新评论');
-- 替换列后
DESC StudentInfo;
+-----=---------+---------+-----------+
| col_name|data_type| comment|
+---------------+---------+-----------+
| name| string| NULL|
| ID| int|new comment|
| # 分区| | |
|没有 分区| | |
+---------------+---------+-----------+
-- 向表中添加新分区 
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18);
-- 在向表中添加新分区后
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
| age=18|
+---------+
-- 从表中删除分区 
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
| age=18|
+---------+
ALTER TABLE StudentInfo DROP IF EXISTS PARTITION (age=18);
-- 在删除表的分区后
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
-- 向表中添加多个分区
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
+---------+
ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18) PARTITION (age=20);
-- 在向表中添加多个分区后
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
| age=11|
| age=12|
| age=15|
| age=18|
| age=20|
+---------+
-- 更改文件格式
ALTER TABLE loc_orc SET fileformat orc;
ALTER TABLE p1 partition (month=2, day=2) SET fileformat parquet;
-- 更改文件位置
ALTER TABLE dbx.tab1 PARTITION (a='1', b=) SET LOCATION -- 设置SERDE/ SERDE属性
ALTER TABLE test_tab SET SERDE ;
ALTER TABLE dbx.tab1 SET SERDE WITH SERDEPROPERTIES (= , = )
-- 设置表属性
ALTER TABLE dbx.tab1 SET TBLPROPERTIES (= );
-- 使用SET属性设置表注释
ALTER TABLE dbx.tab1 SET TBLPROPERTIES (= );
-- 使用SET属性修改表注释
ALTER TABLE dbx.tab1 SET TBLPROPERTIES (= );
-- 删除表属性
ALTER TABLE dbx.tab1 UNSET TBLPROPERTIES ();
-- 恢复分区
ALTER TABLE dbx.tab1 RECOVER PARTITIONS;