
# Iceberg on Aura DDL语法说明
#### 创建Iceberg表
通过CREATE TABLE语法创建Iceberg表。与其他格式的表相比，创建Iceberg表没有特别的参数需要指定，只需要指定STORE AS ICEBERG即可。具体语法请参见[CREATE TABLE](https://support.huaweicloud.com/sqlref-aura-aidatalake/aidatalake_061_0219.html)。
示例：
```
CREATE TABLE iceberg_ext(
col1 int,
col2 varchar(20),
...
)PARTITION BY (col3 bigint) 
TABLEPROPERTIES (
'write.metadata.delete-after-commit.enabled'='true',
'write.metadata.previous-versions-max' = '10' 
) STORE AS ICEBERG;
```
其中write.metadata.delete-after-commit.enabled控制是否在提交事务后删除旧版本元数据文件，默认值为false。当该参数设为true时，可以通过write.metadata.previous-versions-max设定保留多少个metadata。
使用这两个参数需要谨慎，虽然删除元数据文件可以节省存储空间，但需要确保不会影响数据的一致性和可用性。
#### 清空Iceberg表
通过TRUNCATE TABLE语法清空表中的数据，具体语法请参见[TRUNCATE](https://support.huaweicloud.com/sqlref-aura-aidatalake/aidatalake_061_0230.html)。
示例：
```
TRUNCATE TABLE iceberg_ext;
```
#### 删除Iceberg表
通过DROP TABLE语法删除Iceberg表，会同时删除表的元数据及数据（Managed表删除后可以从LakeFormation控制台恢复表的元数据及数据）。具体语法，请参见[DROP TABLE](https://support.huaweicloud.com/sqlref-aura-aidatalake/aidatalake_061_0223.html)。
示例：
```
DROP TABLE iceberg_ext;
```
#### 修改表中的列
通过ALTER TABLE语法的ADD COLUMN、RENAME COLUMN TO、ALTER COLUMN、DROP COLUMNS能力，可以对iceberg表的列进行加列、删列、重命名列、更新列和重新排序列等schema evolution操作。
![](https://support.huaweicloud.com/devg-aidatalake/public_sys-resources/note_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;
  ```
  

- 重命名列： 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-aidatalake/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');
```
