
# 修改Iceberg表
在数据仓库管理中，用户经常需要对Iceberg表进行结构上的调整，如添加新列、修改现有列或调整表属性等，以适应业务变化。然而，如果操作不当，可能会导致数据不一致或性能下降的问题。如何确保在调整表结构时既高效又安全？目前支持对Iceberg表做以下操作：添加列、修改列、删除列、修改表属性、恢复表属性默认值，具体语法可参考[ALTER TABLE](https://support.huaweicloud.com/devg-fabric/dataartsfabric_sql_04_0294.html)。通过这些功能，用户可以灵活地管理Iceberg表，同时保证数据的完整性和系统的稳定性。
#### 修改表中的列
通过ALTER TABLE语法的ADD COLUMN、RENAME COLUMN TO、ALTER COLUMN、DROP COLUMNS能力，可以对iceberg表的列进行加列、删列、重命名列、更新列和重新排序列等schema evolution操作。
![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/notice_3.0-zh-cn.png)
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的长度变长。
    ![](https://support.huaweicloud.com/devg-fabric/public_sys-resources/caution_3.0-zh-cn.png)
    浮点类型的存储是不精确的，从float4更新到float8后，数据的小数部分精度会变化，结果会发生变化。
    
   

- 删除列 iceberg支持删除表列或者复杂类型字段。不能删除分区列，不能删除表的所有列或者复杂类型的所有字段。
  ```
  alter table t_iceberg drop columns (a, b.x);
  ```
  
 
#### 修改表属性
通过ALTER TABLE语法的SET/UNSET TABLEPROPERTIES能力，可以对表的属性值进行修改。
示例：
```
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');
```
