
# CREATE TABLE
#### CREATE TABLE
Spark可以在任何Iceberg Catalog中创建表，Iceberg会将Spark中的列类型转换为相应的Iceberg类型。命令如下：
**SET spark.sql.catalog.** *prod* **= org.apache.iceberg.spark.SparkCatalog;**
**SET spark.sql.catalog.** *prod* **.type = hive;**
**CREATE DATABASE IF NOT EXISTS** *prod.db* **;**
**CREATE TABLE** *prod.db.sample* **(id bigint, data string) USING iceberg;**
创建表命令支持所有范围的Spark Create子句，例如：
- PARTITIONED BY：配置分区。
- LOCATION：设置表位置。
- COMMENT：设置表描述。
- TBLPROPERTIES ('key'='value', ...)：设置表属性。
 
#### PARTITIONED BY
创建分区表的命令为：
```
CREATE TABLE prod.db.sample (id bigint, data string, category string) USING iceberg PARTITIONED BY (category);
```
该子句还支持转换表达式来创建隐式分区：
```
CREATE TABLE prod.db.sample (id bigint, data string, category string, ts timestamp) USING iceberg PARTITIONED BY (bucket(16, id), days(ts), category);
```
转换表达式支持的转换范围包括：
- year(ts)：按年份进行分区。
- month(ts)：按月份进行分区。
- day(ts) or date(ts)：等同于dateint分区，即按日期整数格式分区。
- hour(ts) or date_hour(ts)：等同于dateint + 小时分区，即按日期整数格式与小时组合分区。
- bucket(*N* , *col*)：按列（col）的哈希值对N取模后的结果进行分桶分区。
- truncate(*L* , *col* )：按列（col）值截断至指定长度（L）后进行分区，具体规则如下：
  - 字符串类型：截断为指定长度（L）的字符串。
  
  - 整数（Integer）与长整数（Long）类型：按区间截断，例如truncate (10, i)会生成 0、10、20、30......分区区间。
   
 
#### CREATE TABLE AS SELECT
当使用SparkCatalog时，Iceberg支持将CTAS（CREATE TABLE ... AS SELECT）作为原子操作执行。Iceberg同样支持在SparkSessionCatalog中执行CTAS操作，但该场景下的CTAS不具备原子性。
```
CREATE TABLE prod.db.sample USING iceberg AS SELECT ...;
```
通过CTAS操作生成的新表，不会从SELECT语句所指定的源表中集成分区规范和表属性。如果需要为该新建表配置分区规范或表属性，可在CTAS语句中通过PARTITIONED BY子句明确声明分区规范，通过TBLPROPERTIES子句自定义表属性。命令为：
```
CREATE TABLE prod.db.sample USING iceberg PARTITIONED BY (part) TBLPROPERTIES ('key'='value') AS SELECT ...;
```
#### REPLACE TABLE AS SELECT
当使用SparkCatalog时，Iceberg支持将RTAS（REPLACE TABLE ... AS SELECT）作为原子操作执行。在SparkSessionCatalog中同样支持RTAS操作，但该场景下的RTAS不具备原子性。
原子性表替换会基于SELECT查询的结果创建新快照，同时保留表的历史记录。使用方法为：
- 方式一：
  ```
  REPLACE TABLE prod.db.sample USING iceberg AS SELECT ...;
  ```
  
- 方式二：
  ```
  REPLACE TABLE prod.db.sample USING iceberg PARTITIONED BY (part) TBLPROPERTIES ('key'='value') AS SELECT ...;
  ```
  
- 方式三：
  ```
  CREATE OR REPLACE TABLE prod.db.sample USING iceberg AS SELECT ...;
  ```
  
 
