
# ALTER TABLE
在Spark中，Iceberg完全支持**ALTER TABLE**相关操作。
#### 前提条件
需已存在Iceberg表，例如，执行以下命令创建表：
```
CREATE TABLE prod.db.sample (
    id int, name string, 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"表中添加map类型的"point.m"列：
      ```
      ALTER TABLE prod.db.sample ADD COLUMN point.m 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）
  Iceberg可使用**DROP COLUMN** 语句删除列：
  ```
  ALTER TABLE prod.db.sample DROP COLUMN id;
  ```
  
 
#### 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;
```
不推荐使用，Iceberg使用绝对路径保存元数据文件，重命名操作只会更新最新的元数据文件，而不会更新旧的元数据文件。
