ALTER TABLE

更改表的架构或属性。

表标识符参数

所有语句中的表标识符参数都采用以下形式:

  • table_identifier
    • [database_name.] table_name:表名,可选择使用数据库名称进行限定。
    • delta.`<path-to-table>`:现有 Delta 表的位置。

ADD COLUMNS

在现有表中添加列。

语法

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

有关特定于增量表的 ADD COLUMNS 语法,请参阅增量表架构选项

参数

  • COLUMNS ( col_spec )

    要添加的列。

ADD AND DROP PARTITION

ADD PARTITION

将分区添加到分区表。

语法

ALTER TABLE table_identifier ADD [IF NOT EXISTS]
    ( partition_spec [ partition_spec ... ] )

参数

  • partition_spec

    要添加的分区。

    语法: PARTITION ( partition_col_name = partition_col_val [ , ... ] )

DROP PARTITION

删除表的分区。

语法

ALTER TABLE table_identifier DROP [ IF EXISTS ] partition_spec [PURGE]

参数

  • partition_spec

    要删除的分区。

    语法: PARTITION ( partition_col_name = partition_col_val [ , ... ] )

  • IF EXISTS

    如果该分区不存在,则不会引发异常。

RENAME TO

更改数据库中现有表的名称。

语法

ALTER TABLE table_name RENAME TO table_name

ALTER TABLE table_identifier partition_spec RENAME TO partition_spec

参数

  • table_name

    表名,可选择使用数据库名称进行限定。

    语法: [database_name.] table_name

  • partition_spec

    要重命名的分区。

    语法: PARTITION ( partition_col_name = partition_col_val [ , ... ] )

SET AND UNSET

SET TABLE PROPERTIES

设置和取消设置表属性。 如果已设置属性,将用新属性覆盖旧值。

语法

-- Set Table Properties
ALTER TABLE table_identifier SET TBLPROPERTIES ( key1 = val1, key2 = val2, ... )

-- Unset Table Properties
ALTER TABLE table_identifier UNSET TBLPROPERTIES [ IF EXISTS ] ( key1, key2, ... )

参数

  • TBLPROPERTIES ( key1 = val1, key2 = val2, … )

    要设置或取消设置的表属性。

  • IF EXISTS

    如果该属性不存在,则不会引发异常。

示例:设置表注释

若要设置表注释,请运行:

ALTER TABLE table_name SET TBLPROPERTIES ('comment' = 'A table comment.')

SET SERDE

在 Hive 表中设置 SERDESERDEPROPERTIES。 如果已设置属性,将用新属性覆盖旧值。

语法

-- Set SERDE Properties
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, ... ) ]

参数

  • serde_class_name

    SerDe 类名的完全限定路径。

  • SERDEPROPERTIES ( key1 = val1, key2 = val2, … )

    要设置的 SerDe 属性。

SET LOCATION

更改表定义的位置。 文件会移动到新位置,而不是复制。

语法

-- Change file location
ALTER TABLE table_identifier [ partition_spec ] SET LOCATION 'new_location'

参数

  • partition_spec

    必须在其上设置属性的分区。

  • new_location

    表文件所在位置的路径。

Delta 表架构选项

除标准 ALTER TABLE 选项外,Delta 表还支持本部分中介绍的选项。

本节内容:

ADD COLUMNS

将列(包括嵌套列)添加到现有表中。 如果表中已存在具有相同名称的列或同一嵌套结构,会引发异常。

语法

ALTER TABLE table_identifier ADD COLUMNS (col_name data_type [COMMENT col_comment] [FIRST|AFTER colA_name], ...)

ALTER TABLE table_identifier ADD COLUMNS (col_name.nested_col_name data_type [COMMENT col_comment] [FIRST|AFTER colA_name], ...)

有关添加列的示例,请参阅添加列

CHANGE COLUMN

更改现有表的列定义。 可更改列的数据类型、注释或者为 Null 性,并对列重新排序。

语法

ALTER TABLE table_identifier (ALTER|CHANGE) [COLUMN] alterColumnAction

ALTER TABLE table_identifier (ALTER|CHANGE) [COLUMN] alterColumnAction

alterColumnAction:
    : TYPE dataType
    : [COMMENT col_comment]
    : [FIRST|AFTER colA_name]
    : (SET | DROP) NOT NULL
  • DROP NOT NULL 适用于 Databricks Runtime 7.0 和更高版本。
  • SET NOT NULL 适用于 Databricks Runtime 7.4 和更高版本。

备注

  • 在增量表中只能更改列类型。
  • 可以从 Byte -> Short -> Integer 更改类型,无需数据重写。 所有其他类型更改都需要重写数据

有关更改列的示例,请参阅更改列注释或排序。 另请参阅约束

CHANGE COLUMN(Hive 语法)

更改现有表的列定义。 可以更改列的注释并对列重新排序。

语法

ALTER TABLE table_identifier CHANGE [COLUMN] col_name col_name data_type [COMMENT col_comment] [FIRST|AFTER colA_name]

ALTER TABLE table_identifier CHANGE [COLUMN] col_name.nested_col_name col_name data_type [COMMENT col_comment] [FIRST|AFTER colA_name]

备注

在 Databricks Runtime 7.0 及更高版本中你无法使用 CHANGE COLUMN

  • 要更改复杂数据类型(如结构)的内容。 改用 ADD COLUMNS 来将新列添加到嵌套字段,或使用 ALTER COLUMN 更改嵌套列的属性。
  • 若要放宽列的为 Null 性。 请改用 ALTER TABLE table_name ALTER COLUMN column_name DROP NOT NULL

REPLACE COLUMNS

替换现有表的列定义。 它支持更改列的注释、添加列和对列重新排序。 如果指定的列定义与现有定义不兼容,则引发异常。

语法

ALTER TABLE table_name REPLACE COLUMNS (col_name1 col_type1 [COMMENT col_comment1], ...)

有关替换列的示例,请参阅替换列

ADD CONSTRAINT

备注

适用于 Databricks Runtime 7.4 及更高版本。

为表中的每个输入行添加一个必须为 true 的约束。

有关示例,请参阅 CHECK 约束

语法

ALTER TABLE table_identifier ADD CONSTRAINT constraint_name CHECK condition
  • constraint_name

    要添加的约束的名称。

  • 条件

    对于每个输入行必须为 true 的布尔表达式。

DROP CONSTRAINT

从表中删除约束。

备注

适用于 Databricks Runtime 7.4 及更高版本。

语法

ALTER TABLE table_identifier DROP CONSTRAINT constraint_name
  • constraint_name

    要删除的约束的名称。

示例

-- RENAME table
DESC student;
+-----------------------+---------+-------+
|               col_name|data_type|comment|
+-----------------------+---------+-------+
|                   name|   string|   NULL|
|                 rollno|      int|   NULL|
|                    age|      int|   NULL|
|# Partition Information|         |       |
|             # col_name|data_type|comment|
|                    age|      int|   NULL|
+-----------------------+---------+-------+

ALTER TABLE Student RENAME TO StudentInfo;

-- After Renaming the table
DESC StudentInfo;
+-----------------------+---------+-------+
|               col_name|data_type|comment|
+-----------------------+---------+-------+
|                   name|   string|   NULL|
|                 rollno|      int|   NULL|
|                    age|      int|   NULL|
|# Partition Information|         |       |
|             # col_name|data_type|comment|
|                    age|      int|   NULL|
+-----------------------+---------+-------+

-- RENAME partition

SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=10|
|   age=11|
|   age=12|
+---------+

ALTER TABLE default.StudentInfo PARTITION (age='10') RENAME TO PARTITION (age='15');

-- After renaming Partition
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=11|
|   age=12|
|   age=15|
+---------+

-- Add new columns to a table
DESC StudentInfo;
+-----------------------+---------+-------+
|               col_name|data_type|comment|
+-----------------------+---------+-------+
|                   name|   string|   NULL|
|                 rollno|      int|   NULL|
|                    age|      int|   NULL|
|# Partition Information|         |       |
|             # col_name|data_type|comment|
|                    age|      int|   NULL|
+-----------------------+---------+-------+

ALTER TABLE StudentInfo ADD columns (LastName string, DOB timestamp);

-- After Adding New columns to the table
DESC StudentInfo;
+-----------------------+---------+-------+
|               col_name|data_type|comment|
+-----------------------+---------+-------+
|                   name|   string|   NULL|
|                 rollno|      int|   NULL|
|               LastName|   string|   NULL|
|                    DOB|timestamp|   NULL|
|                    age|      int|   NULL|
|# Partition Information|         |       |
|             # col_name|data_type|comment|
|                    age|      int|   NULL|
+-----------------------+---------+-------+

-- Add a new partition to a table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=11|
|   age=12|
|   age=15|
+---------+

ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18);

-- After adding a new partition to the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=11|
|   age=12|
|   age=15|
|   age=18|
+---------+

-- Drop a partition from the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=11|
|   age=12|
|   age=15|
|   age=18|
+---------+

ALTER TABLE StudentInfo DROP IF EXISTS PARTITION (age=18);

-- After dropping the partition of the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=11|
|   age=12|
|   age=15|
+---------+

-- Adding multiple partitions to the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=11|
|   age=12|
|   age=15|
+---------+

ALTER TABLE StudentInfo ADD IF NOT EXISTS PARTITION (age=18) PARTITION (age=20);

-- After adding multiple partitions to the table
SHOW PARTITIONS StudentInfo;
+---------+
|partition|
+---------+
|   age=11|
|   age=12|
|   age=15|
|   age=18|
|   age=20|
+---------+

-- ALTER OR CHANGE COLUMNS
DESC StudentInfo;
+-----------------------+---------+-------+
|               col_name|data_type|comment|
+-----------------------+---------+-------+
|                   name|   string|   NULL|
|                 rollno|      int|   NULL|
|               LastName|   string|   NULL|
|                    DOB|timestamp|   NULL|
|                    age|      int|   NULL|
|# Partition Information|         |       |
|             # col_name|data_type|comment|
|                    age|      int|   NULL|
+-----------------------+---------+-------+

ALTER TABLE StudentInfo ALTER COLUMN name COMMENT "new comment";

--After ALTER or CHANGE COLUMNS
DESC StudentInfo;
+-----------------------+---------+-----------+
|               col_name|data_type|    comment|
+-----------------------+---------+-----------+
|                   name|   string|new comment|
|                 rollno|      int|       NULL|
|               LastName|   string|       NULL|
|                    DOB|timestamp|       NULL|
|                    age|      int|       NULL|
|# Partition Information|         |           |
|             # col_name|data_type|    comment|
|                    age|      int|       NULL|
+-----------------------+---------+-----------+

-- Change the file Location
ALTER TABLE dbx.tab1 PARTITION (a='1', b='2') SET LOCATION '/path/to/part/ways'

-- SET SERDE/ SERDE Properties
ALTER TABLE test_tab SET SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe';

ALTER TABLE dbx.tab1 SET SERDE 'org.apache.hadoop' WITH SERDEPROPERTIES ('k' = 'v', 'kay' = 'vee')

-- SET TABLE PROPERTIES
ALTER TABLE dbx.tab1 SET TBLPROPERTIES ('winner' = 'loser');

-- SET TABLE COMMENT Using SET PROPERTIES
ALTER TABLE dbx.tab1 SET TBLPROPERTIES ('comment' = 'A table comment.');

-- Alter TABLE COMMENT Using SET PROPERTIES
ALTER TABLE dbx.tab1 SET TBLPROPERTIES ('comment' = 'This is a new comment.');

-- DROP TABLE PROPERTIES
ALTER TABLE dbx.tab1 UNSET TBLPROPERTIES ('winner');