一、描述
ALTER TABLE 语句用于更改表的 schema 或属性。
二、重命名(RENAME)
ALTER TABLE RENAME TO 语句用于更改数据库中现有表的表名。表重命名命令不能用于在数据库之间移动表,只能在同一数据库内重命名表。
如果表已被缓存,该命令会清除表的缓存数据。缓存将在下次访问表时延迟填充。此外:
·表重命名命令会取消缓存所有引用该表的依赖项(如视图)。这些依赖项需要重新显式缓存。
·分区重命名命令会清除所有表依赖项的缓存,但保持它们为已缓存状态。因此,它们的缓存将在下次访问时延迟填充。
三、语法
ALTER TABLE table_identifier RENAME TO table_identifierALTER TABLE table_identifier partition_spec RENAME TO partition_spec
四、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| partition_spec | 要重命名的分区 | PARTITION ( partition_col_name = partition_col_val [ , … ] ) |
五、添加列(ADD COLUMNS)
ALTER TABLE ADD COLUMNS 语句用于向现有表添加指定的列。
六、语法
ALTER TABLE table_identifier ADD COLUMNS ( col_spec [ , … ] )
七、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| COLUMNS ( col_spec ) | 指定要添加的列 | – |
八、删除列(DROP COLUMNS)
ALTER TABLE DROP COLUMNS 语句用于从现有表中删除指定的列。注意此语句仅支持 Iceberg v2 表。
九、语法
ALTER TABLE table_identifier DROP { COLUMN | COLUMNS } [ ( ] col_name [ , … ] [ ) ]
十、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| col_name | 指定列名 | – |
十一、重命名列(RENAME COLUMN)
ALTER TABLE RENAME COLUMN 语句用于更改现有表的列名。注意此语句仅支持 Iceberg v2 表。
十二、语法
ALTER TABLE table_identifier RENAME COLUMN col_name TO col_name
十三、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| col_name | 指定列名 | – |
十四、修改列(ALTER OR CHANGE COLUMN)
ALTER TABLE ALTER COLUMN 或 ALTER TABLE CHANGE COLUMN 语句用于更改列的定义。
十五、语法
ALTER TABLE table_identifier { ALTER | CHANGE } [ COLUMN ] col_name alterColumnAction
十六、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| col_name | 指定列名 | – |
| alterColumnAction | 更改列的定义 | – |
十七、替换列(REPLACE COLUMNS)
ALTER TABLE REPLACE COLUMNS 语句用于删除所有现有列并添加新的列集。注意此语句仅支持 Iceberg v2 表。
十八、语法
ALTER TABLE table_identifier [ partition_spec ] REPLACE COLUMNS [ ( ] qualified_col_type_with_position_list [ ) ]
十九、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| partition_spec | 要替换的分区 | PARTITION ( partition_col_name = partition_col_val [ , … ] ) |
| qualified_col_type_with_position_list | 要添加的列的列表 | col_name col_type [ col_comment ] [ col_position ] [ , … ] |
20、添加分区(ADD PARTITION)
ALTER TABLE ADD 语句用于向分区表添加分区。如果表已被缓存,该命令会清除表及其所有引用依赖项的缓存数据。缓存将在下次访问时延迟填充。
21、语法
ALTER TABLE table_identifier ADD [IF NOT EXISTS] ( partition_spec [ partition_spec … ] )
22、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| partition_spec | 要添加的分区 | PARTITION ( partition_col_name = partition_col_val [ , … ] ) |
23、删除分区(DROP PARTITION)
ALTER TABLE DROP 语句用于删除表的分区。如果表已被缓存,该命令会清除表及其所有引用依赖项的缓存数据。缓存将在下次访问时延迟填充。
24、语法
ALTER TABLE table_identifier DROP [ IF EXISTS ] partition_spec [PURGE]
25、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| partition_spec | 要删除的分区 | PARTITION ( partition_col_name = partition_col_val [ , … ] ) |
26、设置表属性(SET TABLE PROPERTIES)
ALTER TABLE SET 命令用于设置表属性。如果某个属性已经设置,新值将覆盖旧值。ALTER TABLE UNSET 用于删除表属性。
27、语法
— 设置表属性ALTER TABLE table_identifier SET TBLPROPERTIES ( key1 = val1, key2 = val2, … )– 取消设置表属性ALTER TABLE table_identifier UNSET TBLPROPERTIES [ IF EXISTS ] ( key1, key2, … )
28、设置 SERDE
ALTER TABLE SET 命令用于在 Hive 表中设置 SERDE 或 SERDE 属性。如果某个属性已经设置,新值将覆盖旧值。
29、语法
— 设置 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, … ) ]
30、设置位置和文件格式(SET LOCATION And SET FILE FORMAT)
ALTER TABLE SET 命令也可用于更改现有表的文件位置和文件格式。如果表已被缓存,ALTER TABLE .. SET LOCATION 命令会清除表及其所有引用依赖项的缓存数据。
31、语法
— 更改文件格式ALTER TABLE table_identifier [ partition_spec ] SET FILEFORMAT file_format– 更改文件位置ALTER TABLE table_identifier [ partition_spec ] SET LOCATION 'new_location'
32、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
| partition_spec | 指定要设置属性的分区 | PARTITION ( partition_col_name = partition_col_val [ , … ] ) |
| SERDEPROPERTIES | 指定要设置的 SERDE 属性 | ( key1 = val1, key2 = val2, … ) |
33、恢复分区(RECOVER PARTITIONS)
ALTER TABLE RECOVER PARTITIONS 语句用于恢复表目录中的所有分区并更新 Hive 元数据存储。另一种恢复分区的方法是使用 MSCK REPAIR TABLE。
34、语法
ALTER TABLE table_identifier RECOVER PARTITIONS
35、参数
| 参数 | 说明 | 语法 |
| table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
36、示例
— 创建分区表CREATE EXTERNAL TABLE student_alter_test (name STRING, rollno INT) USING PARQUET PARTITIONED BY (age INT) LOCATION 'cosn://<your_bucket_name>//test_alter_table/student';– 重命名表ALTER TABLE student_alter_test RENAME TO student_info_test;– 验证重命名后的表结构DESC student_info_test;– 添加列ALTER TABLE student_info_test ADD COLUMNS (LastName STRING, DOB TIMESTAMP);– 修改列注释ALTER TABLE student_info_test ALTER COLUMN LastName COMMENT 'new comment';– 添加分区ALTER TABLE student_info_test ADD IF NOT EXISTS PARTITION (age=18);ALTER TABLE student_info_test ADD IF NOT EXISTS PARTITION (age=18) PARTITION (age=20);– 查看分区SHOW PARTITIONS student_info_test;– 删除分区ALTER TABLE student_info_test DROP IF EXISTS PARTITION (age=20);– 设置表属性ALTER TABLE student_info_test SET TBLPROPERTIES ('winner' = 'loser');ALTER TABLE student_info_test UNSET TBLPROPERTIES ('winner');– 设置位置ALTER TABLE student_info_test SET LOCATION 'cosn://<your_bucket_name>//test_alter_table/new_location';– 设置 SERDE 属性ALTER TABLE student_info_test SET SERDEPROPERTIES ('key1' = 'val1');– RECOVER PARTITIONSCREATE EXTERNAL TABLE recover_part_test (id INT, name STRING, score INT) PARTITIONED BY (subject STRING) STORED AS PARQUET LOCATION 'cosn://<your_bucket_name>//test_alter_table/recover_part_test';ALTER TABLE recover_part_test ADD PARTITION (subject='math');INSERT INTO recover_part_test PARTITION (subject='math') VALUES (1, 'Charlie', 95), (2, 'Diana', 88);INSERT INTO recover_part_test PARTITION (subject='physics') VALUES (3, 'Eve', 92), (4, 'Frank', 78);SELECT * FROM recover_part_test;SHOW PARTITIONS recover_part_test;ALTER TABLE recover_part_test RECOVER PARTITIONS;SHOW PARTITIONS recover_part_test;