更新时间:2026-06-11 GMT+08:00
分享

ALTER TABLE

在Spark中,Iceberg完全支持ALTER TABLE相关操作。

前提条件

需已存在Iceberg表,例如,执行以下命令创建表:

CREATE TABLE prod.db.sample ( id int, name string, gender string, salary int, comb int, col0 int, col1 bigint, col2 float, col3 double, col4 decimal(10,4), col5 string, col6 date, col7 timestamp, col8 boolean, par date ) USING iceberg PARTITIONED BY (par) TBLPROPERTIES( 'write.format.default'='parquet' );

ALTER TABLE SET/UNSET TBLPROPERTIES

设置与移除表属性(ALTER TABLE ... SET/UNSET TBLPROPERTIES):
  • 设置表属性:
    ALTER TABLE prod.db.sample SET TBLPROPERTIES ('read.split.target-size'='268435456');

    SET TBLPROPERTIES命令也可用于设置表的注释(描述信息):

    ALTER TABLE prod.db.sample SET TBLPROPERTIES ( 'comment' = 'A table comment.');
  • 移除表属性,可使用UNSET命令:
    ALTER TABLE prod.db.sample UNSET TBLPROPERTIES ('read.split.target-size');

ALTER TABLE ADD/RENAME/DROP COLUMN

  • 新增列
    • 可使用ALTER TABLE语句的ADD COLUMNS子句向Iceberg表添加列,且不允许通过添加列的方式修改映射(map)的 “键(key)” 列,仅能更新映射的值(value)。示例如下:
      • 向“prod.db.sample”表中添加struct类型的“point”列:
        ALTER TABLE prod.db.sample ADD COLUMN point struct<x: double, y: double>;
      • 向“prod.db.sample”表中添加double类型的“point.z”列:
        ALTER TABLE prod.db.sample ADD COLUMN point.z double;
      • 向“prod.db.sample”表中添加array类型的“points”列:
        ALTER TABLE prod.db.sample ADD COLUMN points array<struct<x: double, y: double>>;
      • 向“prod.db.sample”表中添加double类型的“points.element.z”列:
        ALTER TABLE prod.db.sample ADD COLUMN points.element.z double;
      • 向“prod.db.sample”表中添加map类型的“points”列:
        ALTER TABLE prod.db.sample ADD COLUMN points map<struct<x: int>, struct<a: int>>;
    • 也可通过添加FIRST或AFTER子句,在表中的任意位置添加列,示例如下:
      • 示例一:
        ALTER TABLE prod.db.sample ADD COLUMN new_column bigint AFTER {表中已有字段名(例如id,data等)};
      • 示例二:
        ALTER TABLE prod.db.sample ADD COLUMN new_column bigint FIRST;
  • 重命名列(ALTER TABLE ... RENAME COLUMN)

    Iceberg允许对任意字段进行重命名。如果需要重命名字段,可使用RENAME COLUMN子句:

    ALTER TABLE prod.db.sample RENAME COLUMN data TO payload;
  • 可使用ALTER TABLE ... DROP COLUMN语句删除列:
    ALTER TABLE prod.db.sample DROP COLUMN id;
  • 新增、删除和重命名嵌套字段

    可使用ADD COLUMNDROP COLUMN为结构体(struct)添加或删除列。

ALTER TABLE ALTER COLUMN

  • 调整顶层列与嵌套结构体字段的顺序

    Iceberg允许使用FIRST和AFTER子句调整顶层列或结构体中的列顺序:

    ALTER TABLE prod.db.sample ALTER COLUMN point FIRST;
  • 拓宽int、float、decimal字段的类型(ALTER TABLE ... ALTER COLUMN)

    ALTER COLUMN用于拓宽字段类型,将字段设为可选项、设置注释以及调整字段顺序。

    Iceberg允许在类型更新安全的前提下修改列类型,安全的列类型更新包括:

    • int到bigint
    • float到double
    • decimal (P,S)到decimal (P2,S),其中P2 > P,即精度可提高,小数位数不可变更。
    CREATE TABLE prod.db.sample (id bigint, data string,  measurement float) USING iceberg;

    例如,执行以下命令将“measurement”列的类型变更为“double”:

    ALTER TABLE prod.db.sample ALTER COLUMN measurement TYPE double;
    也可使用ALTER COLUMN更新列注释:
    ALTER TABLE prod.db.sample ALTER COLUMN measurement COMMENT 'unit is kilobytes per second';
  • 非空列(required column)改为可空列(optional column)

    可通过DROP NOT NULL更改非空列的可空性:

    ALTER TABLE prod.db.sample ALTER COLUMN id DROP NOT NULL;
  • 通过启用SQL扩展,还可支持分区演进与表写入顺序设置功能。

ALTER TABLE RENAME TO

重命名表(ALTER TABLE ... RENAME TO):
ALTER TABLE prod.db.sample RENAME TO prod.db.new_name;

相关文档