
# CREATE TABLE
#### 功能描述
CREATE TABLE为Aura服务下特有语法，该语法功能是在LakeFormation上创建指定名称的表。
关于表达式分区表的详细说明，请参考[表达式分区](https://support.huaweicloud.com/devg-aidatalake/aidatalake_05_0017.html)。
#### 注意事项
- PARTITION BY中出现的列不能出现在表的普通列描述中，分区列始终排在普通列的后面。
- PARTITION BY中支持的最大分区键数目是4。
- CLUSTERED BY语法适用范围：ORC、PARQUET
- PARTITION BY语法适用范围：ORC、PARQUET、Hudi、Iceberg
- 不支持用户将ctid、xc_node_id作为列名。
- 当前实现的表达式分区的主要约束，请参见[约束与限制](https://support.huaweicloud.com/devg-aidatalake/aidatalake_05_0017.html#section0)。
 
#### 语法格式
```
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表，文件，元数据和统计信息都由Aura管理。
  
- **IF NOT EXISTS**
  如果存在同名表，则发出一个notice而不是抛出一个错误。
  
- **schema_name**
  表所属的数据库名，如果未指定数据库名时，则将在current_schema下建表。
  
- **table_name**
  创建表的表名，表名长度不可超过63个字符。
  
- **col_name**
  创建表的列名，列名长度不可超过63个字符。普通列和分区列的数量总和不可超过5000个。
  
- **col_type**
  创建表的列类型，列类型支持范围如下：
  
  | 列类型       | 是否可以声明为分区列 | 是否支持ORC格式 | 是否支持PARQUET格式 | 是否支持Iceberg格式 | 是否支持Lance格式 |
  |:---|:---|:---|:---|:---|:---|
  | 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                                   | zstd、snappy、lz4、uncompressed                      | ORC文件压缩方式。                                                                                                                                                                        | ORC                                                                           |
  | orc.stripe.byte.size                           | 整数，取值范围大于等于1000000                                | ORC文件stripe大小。                                                                                                                         | ORC                                                                           |
  | parquet.compression                            | zstd、snappy、lz4、uncompressed                      | PARQUET文件压缩方式。                                                                                                                                                                    | PARQUET                                                                       |
  | parquet.compression-level                      | 整数，取值范围为-131072\~22                               | 指定PARQUET表下次写入数据时的压缩方式。仅当使用zstd算法时，可以指定压缩等级，取值范围为-131072\~22，默认值为1。                                                                                                               | PARQUET                                                                       |
  | parquet.row.group.byte.size                    | 整数，取值范围大于等于1000000                                | Parquet文件RowGroup大小。                                                                                                                                                              | PARQUET                                                                       |
  | parquet.page.size                              | 整数                                                | Parquet文件page大小。                                                                                                                                                                  | PARQUET                                                                       |
  | parquet.dictionary.page.size                   | 整数                                                | Parquet文件字典大小。                                                                                                                                                                    | PARQUET                                                                       |
  | julian_adjust                                  | true、false                                        | 是否转换为Julian日期。                                                                                                                                                                    | PARQUET                                                                       |
  | parquet.bloom.filter.enabled.column.col        | true、false                                        | col1列是否写入BloomFilter索引。                                                                                                                                                           | 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                                                                       |
  | format-version                                 | 2，3                                               | 设置Iceberg表版本。                                                                                                                                                                     | Iceberg                                                                       |
  | write.parquet.compression-codec                | zstd、lz4、snappy、gzip、uncompressed                 | parquet文件的压缩方式。                                                                                                                                                                   | Iceberg                                                                       |
  | write.parquet.compression-level                | 整数，取值范围为-131072\~22                               | 指定Iceberg表PARQUET文件下次以zstd算法压缩写入数据时的压缩等级。仅当使用zstd算法时，可以指定压缩等级，取值范围为-131072\~22，默认为1。 当前此选项行为与Iceberg默认行为不一致时，Iceberg不支持的格式默认不生效且支持gzip指定压缩等级。 | 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                                                                       |
  | metafile_location                              | **metadata.json**路径                               | 创建External Iceberg表时，指定的**metadata.json**路径。                                                                                                                                      | Iceberg                                                                       |
  | commit.retry.num-retries                       | 大于0的整数                                            | 提交失败重试次数。                                                                                                                                                                         | Iceberg                                                                       |
  | commit.retry.min-wait-ms                       | 大于0的整数                                            | 提交失败最小等待时间。                                                                                                                                                                       | Iceberg                                                                       |
  | commit.retry.max-wait-ms                       | 大于0的整数                                            | 提交失败最大等待时间。                                                                                                                                                                       | Iceberg                                                                       |
  | commit.retry.total-timeout-ms                  | 大于0的整数                                            | 提交失败最长等待时间。                                                                                                                                                                       | Iceberg                                                                       |
  | write.parquet.row-group-size-bytes             | 大于0的整数                                            | Parquet文件RowGroup大小。                                                                                                                                                              | Iceberg                                                                       |
  | write.parquet.page-size-bytes                  | 大于0的整数                                            | Parquet文件页大小。                                                                                                                                                                     | Iceberg                                                                       |
  | write.parquet.page-row-limit                   | 大于0的整数                                            | Parquet文件页最大行数。                                                                                                                                                                   | Iceberg                                                                       |
  | write.parquet.dict-size-bytes                  | 大于0的整数                                            | Parquet文件字典大小。                                                                                                                                                                    | Iceberg                                                                       |
  | write.parquet.bloom-filter-max-bytes           | 大于0的整数                                            | 布隆过滤器位集的最大字节数。                                                                                                                                                                    | Iceberg                                                                       |
  | write.target-file-size-bytes                   | 大于0的整数                                            | Parquet文件大小。                                                                                                                                                                      | Iceberg                                                                       |
  | write.delete.target-file-size-bytes            | 大于0的整数  | **delete**文件大小。                                                                                                                                                                   | Iceberg                                                                       |
  | write.format.default                           | parquet                                           | Iceberg写入数据的格式，仅支持**parquet**。                                                                                                                                                    | Iceberg                                                                       |
  | header                                         | true、false                                        | CSV文件是否带有描述列名的header行。                                                                                                                                                            | CSV  |
  | separatorChar                                  | 单字节字符，不能是\\r和\\n                                  | 指定CSV数据文件行数据的字段分隔符，不指定则使用默认分隔符","。                                                                                                                                                | CSV  |
  | quoteChar                                      | 单字节字符，不能与分隔符、null参数相同                             | 用于设置将CSV格式数据源文件中什么字符识别为引号字符，缺省值为双引号。                                                                                                                                              | CSV  |
  | escapeChar                                     | 单字节字符                                             | 用于指定CSV格式数据源文件中的逃逸字符，其缺省值与quoteChar相同。                                                                                                                                            | CSV  |
  | field.delim                                    | 单字节字符，不能是\\r和\\n                                  | 指定TEXT数据文件行数据的字段分隔符，不指定则使用默认分隔符"\|"。                                                                                                                                              | TEXT                                                                          |
  | serialization.null.format                      | 单字节字符                                             | 用来指定数据文件中空值的表示，缺省值是\\n                                                                                                                                                            | TEXT                                                                          |
  | escape.delim                                   | 单字节字符                                             | 用于指定TEXT格式数据源文件中的逃逸字符，其缺省值与quoteChar相同。                                                                                                                                           | TEXT                                                                          |
  | line.delim                                     | 单字节字符                                             | 指定数据文件换行符样式，默认\\n。                                                                                                                                                                | TEXT                                                                          |
  | enable.blob                                    | true、false                                        | 指定该列使用BLOB存储。                                                                                                                                                                     | Lance                                                                         |
  | arrow.fixed-size-list                          | 整数，取值范围1\~2147483647                              | 指定该列存储为arrow中的FixedSizeList。                                                                                                                                                      | Lance                                                                         |
  | max.rows.per.file                              | 整数，取值范围1\~9223372036854775807                     | 指定一个文件写入最大行数。                                                                                                                                                                     | Lance                                                                         |
  | max.bytes.per.file                             | 整数，取值范围1\~9223372036854775807                     | 指定一个文件写入最大字节数。                                                                                                                                                                    | Lance                                                                         |
  | lance.encoding.compression                     | 字符串，取值范围为zstd、lz4、fsst                            | 指定Lance表下次写入数据时的压缩方式。当使用zstd算法时，可以指定压缩等级，取值范围为0\~22，例如**zstd:22**。                                                                                                                | Lance                                                                         |
  | lance.batch.readahead                          | 整数，取值范围为1\~9223372036854775807                    | 指定预读的Batch数目。                                                                                                                                                                     | Lance                                                                         |
  | lance.fragment.readahead                       | 整数，取值范围为1\~9223372036854775807                    | 指定预读的Fragment数目。                                                                                                                                                                  | Lance                                                                         |
  | lance.storage.version                          | 字符串，取值范围为0.1、2.0、2.1、2.2                          | 指定储存的Lance格式版本。                                                                                                                                                                   | Lance                                                                         |
  | lance.block.size                               | 整数，取值范围为1\~34359738368                            | 指定向存储层发起单次IO请求最小字节数。                                                                                                                                                              | Lance                                                                         |
  | metadata.cache.size                            | 整数，取值范围为1\~34359738368                            | 指定元数据缓存大小字节数。                                                                                                                                                                     | Lance                                                                         |
  | io.buffer.size                                 | 整数，取值范围为1\~34359738368                            | 指定IO缓冲区大小字节数。                                                                                                                                                                     | Lance                                                                         |
  | index.cache.size                               | 整数，取值范围为1\~34359738368                            | 指定索引缓存大小字节数。                                                                                                                                                                      | Lance                                                                         |
     
  - **table_format**
    表存储格式，支持ORC、PARQUET、ICEBERG、TEXT、CSV、LANCE六种存储格式。
    ![](https://support.huaweicloud.com/sqlref-aura-aidatalake/public_sys-resources/caution_3.0-zh-cn.png)
    TEXT、CSV仅支持基础的数据导入导出，不支持高阶功能，例如分区、Analyze操作等；不建议作为数据存储、加工介质使用。
    
  
  
  
  - **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-aidatalake/aidatalake_05_0017.html#section3)。
