更新时间:2025-12-10 GMT+08:00
分享

修改Iceberg表

在数据仓库管理中,用户经常需要对Iceberg表进行结构上的调整,如添加新列、修改现有列或调整表属性等,以适应业务变化。然而,如果操作不当,可能会导致数据不一致或性能下降的问题。如何确保在调整表结构时既高效又安全?目前支持对Iceberg表做以下操作:添加列、修改列、删除列、修改表属性、恢复表属性默认值,具体语法可参考ALTER TABLE。通过这些功能,用户可以灵活地管理Iceberg表,同时保证数据的完整性和系统的稳定性。

修改表中的列

通过ALTER TABLE语法的ADD COLUMN、RENAME COLUMN TO、ALTER COLUMN、DROP COLUMNS能力,可以对iceberg表的列进行加列、删列、重命名列、更新列和重新排序列等schema evolution操作。

iceberg通过唯一编号fieldId为列进行编号,在写入数据时会将fieldId写入文件的schema中,在读取文件的schema时通过fieldId将元数据的列与文件中的列映射起来,能够实现schema evolution后的读取。对于非iceberg写入的文件,schema中不存在fieldId,读取文件时会以列名为依据进行映射,进行schema evolution操作后,如果存在复用列名的情况,可能会导致类型不匹配而读取失败或者读取到了以前的数据。

示例:

建iceberg分区表:

CREATE TABLE t_iceberg(a int, b array<struct<x:int, y:int>>) partition by (c int) store as iceberg;
  • 添加列:

    iceberg表支持添加一列或者多列到表中或者复杂类型字段中,需要指定列名和类型,可以指定注释和位置。当添加到复杂类型字段中时,不能指定注释。

    -- 添加到表中
    alter table t_iceberg add column d int, e float comment 'this is e', f array<int> after a, g struct<x:int,y:int> comment 'this is g' before b;
    -- 添加到复杂类型字段中,需要使用element来指定array的子类型
    alter table t_iceberg add column b.element.z int after x, b.element.a before z;
  • 重命名列:

    iceberg表支持对表列或者复杂类型字段进行重命名。

    alter table t_iceberg rename column a to newa;
    alter table t_iceberg rename column b.element.x to newx;
  • 更新列:

    iceberg表支持更新表列的类型、注释和位置,支持更新复杂类型字段的类型和位置。

    alter table t_iceberg alter column a type bigint comment 'this is a' after c, c type bigint comment 'this is c' after a, b.element.y type bigint after first;

    当前仅支持从低精度类型更新到高精度类型:

    • 整数类型:从smallint更新到int或者bigint,从int更新到bigint。
    • 浮点类型:从float4更新到float8。
    • numeric类型:从低precision更新到高precision,不支持更新scale。
    • 字符串类型:varchar或者char的长度变长。

      浮点类型的存储是不精确的,从float4更新到float8后,数据的小数部分精度会变化,结果会发生变化。

  • 删除列

    iceberg支持删除表列或者复杂类型字段。不能删除分区列,不能删除表的所有列或者复杂类型的所有字段。

    alter table t_iceberg drop columns (a, b.x);

修改表属性

通过ALTER TABLE语法的SET/UNSET TABLEPROPERTIES能力,可以对表的属性值进行修改。

示例:

1
2
ALTER TABLE iceberg_ext SET TABLEPROPERTIES ('write.metadata.delete-after-commit.enabled' = 'false');
ALTER TABLE iceberg_ext UNSET TABLEPROPERTIES ('write.metadata.delete-after-commit.enabled');

相关文档