描述
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 ] [ , ... ] |
添加分区(ADD PARTITION)
ALTER TABLE ADD 语句用于向分区表添加分区。如果表已被缓存,该命令会清除表及其所有引用依赖项的缓存数据。缓存将在下次访问时延迟填充。语法
ALTER TABLE table_identifier ADD [IF NOT EXISTS]( partition_spec [ partition_spec ... ] )
参数
参数 | 说明 | 语法 |
table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
partition_spec | 要添加的分区 | PARTITION ( partition_col_name = partition_col_val [ , ... ] ) |
删除分区(DROP PARTITION)
ALTER TABLE DROP 语句用于删除表的分区。如果表已被缓存,该命令会清除表及其所有引用依赖项的缓存数据。缓存将在下次访问时延迟填充。语法
ALTER TABLE table_identifier DROP [ IF EXISTS ] partition_spec [PURGE]
参数
参数 | 说明 | 语法 |
table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
partition_spec | 要删除的分区 | PARTITION ( partition_col_name = partition_col_val [ , ... ] ) |
设置表属性(SET TABLE PROPERTIES)
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, ... ) ]
设置位置和文件格式(SET LOCATION And SET FILE FORMAT)
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'
参数
参数 | 说明 | 语法 |
table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
partition_spec | 指定要设置属性的分区 | PARTITION ( partition_col_name = partition_col_val [ , ... ] ) |
SERDEPROPERTIES | 指定要设置的 SERDE 属性 | ( key1 = val1, key2 = val2, ... ) |
恢复分区(RECOVER PARTITIONS)
ALTER TABLE RECOVER PARTITIONS 语句用于恢复表目录中的所有分区并更新 Hive 元数据存储。另一种恢复分区的方法是使用 MSCK REPAIR TABLE。语法
ALTER TABLE table_identifier RECOVER PARTITIONS
参数
参数 | 说明 | 语法 |
table_identifier | 指定表名,可以选择性地用数据库名进行限定 | [ database_name. ] table_name |
示例
-- 创建分区表CREATE EXTERNAL TABLE student_alter_test (name STRING, rollno INT)USING PARQUETPARTITIONED 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 PARQUETLOCATION '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;