
# CREATE TABLE
#### 功能描述
CREATE TABLE为DataArts Fabric SQL服务下特有语法，该语法功能是在LakeFormation上创建指定名称的表。
关于表达式分区表的详细说明，请参考[表达式分区](https://support.huaweicloud.com/devg-fabric/dataartsfabric_sql_04_0039.html)。
#### 注意事项
- PARTITION BY中出现的列不能出现在表的普通列描述中，分区列始终排在普通列的后面。
- PARTITION BY中支持的最大分区键数目是4。
- CLUSTERED BY语法仅适用于ORC、PARQUET表，不适用于Iceberg表。
- 不支持用户将ctid、xc_node_id作为列名。
- 当前实现的表达式分区的主要约束，请参考[约束限制](https://support.huaweicloud.com/devg-fabric/dataartsfabric_sql_04_0039.html#ZH-CN_TOPIC_0000002503644071__section2441427174517)。
 
#### 语法格式
```
CREATE [ EXTERNAL ] TABLE [ IF NOT EXISTS ] [schema_name.]table_name 
[ ( col_name col_type [ COMMENT col_comment ] [, ... ] ) ]
[ COMMENT table_comment ]
[ PARTITION BY ( col_name col_type COMMENT col_comment | year(col_name) | month(col_name) | day(col_name) | hour(col_name)| truncate(width, col_name) | bucket(bucket_num, col_name)[, ... ] ) ]
[ CLUSTERED BY (col_name [,...]) INTO ( bucket_num ) BUCKETS ]
[ TABLEPROPERTIES ( option_key = option_value [, ... ] ) ]
[ STORE AS table_format ]
[ LOCATION table_path ]
AS select_stmt;
```
#### 参数说明
- **EXTERNAL**
  如果指定该关键字，则创建EXTERNAL表；如果无该关键字，则默认创建MANAGED表，文件，元数据和统计信息都由DataArts Fabric SQL管理。
  
- **IF NOT EXISTS**
  如果存在同名表，则发出一个notice而不是抛出一个错误。
  
- **schema_name**
  表所属的数据库名，如果未指定数据库名时，则将在current_schema下建表。
  
- **table_name**
  创建表的表名，表名长度不可超过63个字符。
  
- **col_name**
  创建表的列名，列名长度不可超过63个字符。普通列和分区列的数量总和不可超过5000个。
  
- **col_type**
  创建表的列类型，列类型支持范围如下：
  
  | 列类型       | 是否可以声明为分区列 | 是否支持ORC格式 | 是否支持PARQUET格式 | 是否支持Iceberg格式 |
  |:---|:---|:---|:---|:---|
  | SmallInt  | √          | √         | √             | √             |
  | Int       | √          | √         | √             | √             |
  | BigInt    | √          | √         | √             | √             |
  | Float     | ×          | √         | √             | √             |
  | Double    | ×          | √         | √             | √             |
  | Decimal   | √          | √         | √             | √             |
  | Numeric   | √          | √         | √             | √             |
  | Timestamp | √          | √         | √             | √             |
  | Date      | √          | √         | √             | √             |
  | Varchar   | √          | √         | √             | √             |
  | Char      | √          | √         | √             | √             |
  | Bool      | ×          | √         | √             | √             |
  | Bytea     | ×          | √         | √             | √             |
  | Text      | √          | √         | √             | √             |
  | Array     | ×          | √         | √             | √             |
  | Struct    | ×          | √         | √             | √             |
     
  
- **col_comment**
  列注释信息，可指定为任意字符串。
  
- **table_comment**
  表注释信息，可指定为任意字符串。
  
- **bucket_num**
  bucket个数。
  

- **option_key = option_value**
  表级别参数设置，支持参数范围如下：
   表1option_key参数支持范围 
  | option_key                                     | option_value                         | 说明                                       | 适用范围        |
  |:---|:---|:---|:---|
  | orc.compress                                   | zlib, snappy, lz4, uncompressed      | ORC文件压缩方式。                               | ORC         |
  | parquet.compression                            | zlib, snappy, lz4, uncompressed      | PARQUET文件压缩方式。                           | PARQUET     |
  | julian_adjust                                  | true, false                          | 是否转换为Julian日期。                           | PARQUET     |
  | checkencoding                                  | high, low, no                        | 是否检查字符编码。                                | ORC、PARQUET |
  | column_index_access                            | true, false                          | 读取时表定义列和文件列匹配方式，默认true为列索引匹配，false为列名匹配。 | ORC、PARQUET |
  | filesize                                       | 1\~1024的整数                           | 生成外表文件大小。                                | ORC、PARQUET |
  | write.delete.mode                              | copy-on-write, merge-on-read         | 设置delete时的模式：cow或mor。                    | Iceberg     |
  | write.update.mode                              | copy-on-write, merge-on-read         | 设置update时的模式：cow或mor。                    | Iceberg     |
  | write.merge.mode                               | copy-on-write, merge-on-read         | 设置merge时的模式：cow或mor。                     | Iceberg     |
  | write.parquet.compression-codec                | zstd, lz4, snappy, gzip,uncompressed | parquet文件的压缩方式。                          | Iceberg     |
  | write.merge.isolation-level                    | snapshot, serializable               | merge命令的隔离级别。                            | Iceberg     |
  | write.metadata.delete-after-commit.enabled     | true, false                          | 控制提交后是否删除最旧的跟踪版本元数据文件。                   | Iceberg     |
  | write.update.isolation-level                   | snapshot, serializable               | update命令的隔离级别。                           | Iceberg     |
  | write.delete.isolation-level                   | snapshot, serializable               | delete命令的隔离级别。                           | Iceberg     |
  | write.metadata.previous-versions-max           | 大于0的整数                               | 要保留的旧元数据文件的数量。                           | Iceberg     |
  | write.parquet.bloom-filter-enabled.column.col1 | true, false                          | col1列是否写入bloom filter索引。                 | Iceberg     |
     
  - **table_format**
    表存储格式，支持ORC、PARQUET、ICEBERG三种存储格式。
    
  
  
  
  - **table_path**
    表存储路径，必须为合法OBS路径，支持OBS对象桶和并行文件系统。如果该路径为OBS对象桶路径，则该表只读，否则该表支持读写。如果创建表类型为托管表（Managed Table），则不允许指定表存储路径，表存储路径由系统指定为Schema路径下与表名同名路径，且要求该路径在建表时为空。
    
  
  
  
  - **select_stmt**
    查询语句。外部表（External Table）不支持CTAS语句。
    
   
 
#### 示例
创建ORC表：
```
CREATE TABLE test_table1 (a int, b bool, c text) store as orc;
```
创建iceberg表达式分区表示例，请参见[创建表达式分区表](https://support.huaweicloud.com/devg-fabric/dataartsfabric_sql_04_0039.html#ZH-CN_TOPIC_0000002503644071__section1644234316504)。
