
# 使用DataSource语法创建Managed Table
#### 功能描述
使用DataSource语法创建管理表。DataSource语法和Hive语法主要区别在于支持的表数据存储格式范围、支持的分区数等有差异，详细请参考语法格式和注意事项说明。
#### 注意事项
- CTAS建表语句不能指定表的属性。
- 若没有指定分隔符，则默认为逗号（,）。
- 关于分区表的使用说明：
  - 创建分区表时，PARTITIONED BY中指定分区列必须是表中的列，且必须在Column列表中指定类型。分区列只支持STRING, BOOLEAN, TINYINT, SMALLINT, SHORT, INT, BIGINT, LONG, DECIMAL, FLOAT, DOUBLE, DATE, TIMESTAMP类型。
  
  - 创建分区表时，分区字段必须是表字段的最后一个字段或几个字段，且多分区字段的顺序也必须对应。否则将出错。
  
  - 单表分区数最多允许200000个。
   
 
#### 语法格式
```
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name 
  [(col_name1 col_type1 [COMMENT col_comment1], ...)]
  USING file_format 
  [OPTIONS (key1=val1, key2=val2, ...)] 
  [PARTITIONED BY (col_name1, col_name2, ...)]
  [COMMENT table_comment]
  [AS select_statement];
```
#### 关键字
- IF NOT EXISTS：指定该关键字以避免表已经存在时报错。
- USING：指定存储格式。
- OPTIONS：指定建表时的属性名与属性值。
- COMMENT：字段或表描述。
- PARTITIONED BY：指定分区字段。
- AS：使用CTAS创建表。
 
#### 参数说明
表1基本参数 
| **参数**               | **是否必选** | **描述**                                                                                                                                                                                                             |
|:---|:---|:---|
| **db_name**          | 否        | Database名称。由字母、数字和下划线（_）组成。不能是纯数字，且不能以数字和下划线开头。                                                                                                                                                                    |
| **table_name**       | 是        | Database中的表名。由字母、数字和下划线（_）组成。不能是纯数字，且不能以数字和下划线开头。 匹配规则为：\^(?!_)(?!\[0-9\]+$)\[A-Za-z0-9_$\]\*$。 特殊字符需要使用单引号（''）包围起来。表名对大小写不敏感，即不区分大小写。 |
| **col_name**         | 是        | 以逗号分隔的带数据类型的列名。列名由字母、数字和下划线（_）组成。不能是纯数字，且至少包含一个字母。列名为大小写不敏感，即不区分大小写。                                                                                                                                               |
| **col_type**         | 是        | 列字段的数据类型。数据类型为原生类型。请参考原生数据类型。                                                                                                                                                                                      |
| **col_comment**      | 否        | 列字段描述。仅支持字符串常量。                                                                                                                                                                                                    |
| **file_format**      | 是        | 管理表数据存储格式，支持：PARQUET和ORC格式。                                                                                                                                                                                        |
| **table_comment**    | 否        | 表描述。仅支持字符串常量。                                                                                                                                                                                                      |
| **select_statement** | 否        | 用于CTAS命令，将源表的SELECT查询结果或某条数据插入到新创建的管理表中。                                                                                                                                                                           |
   
表2OPTIONS参数 
| **参数**                  | **是否必选** | **描述**                                                 | **默认值** |
|:---|:---|:---|:---|
| **multiLevelDirEnable** | 否        | 是否迭代查询子目录中的数据。当配置为true时，查询该表时会迭代读取该表路径中所有文件，包含子目录中的文件。 | false   |
| **compression**         | 否        | 指定压缩格式。一般为parquet格式时指定该参数，推荐使用zstd压缩格式。                | -       |
   
#### 示例1：创建基本管理表
创建名为table1的非分区管理表，使用USING关键字指定存储格式为ORC格式。
```
CREATE TABLE IF NOT EXISTS table1 (
    col_1 STRING,
    col_2 INT
)
USING orc;
```
#### 示例2：创建带默认值和注释的管理表
创建名为employee的管理表，附带列注释和表注释。
```
CREATE TABLE IF NOT EXISTS employee (
    id      INT COMMENT '员工编号',
    name    STRING COMMENT '员工姓名',
    salary  DECIMAL(10,2) COMMENT '员工薪资'
)
USING parquet
COMMENT '员工信息管理表';
```
#### 示例3：使用不同格式创建管理表（ORC、JSON）
创建使用不同数据格式的管理表。
```
-- 使用ORC格式
CREATE TABLE IF NOT EXISTS table_orc (
    id      INT,
    data    STRING
)
USING orc;
-- 使用JSON格式
CREATE TABLE IF NOT EXISTS table_json (
    id      INT,
    info    STRING
)
USING json;
```
#### 示例4：创建带分区的管理表
创建名为student的分区管理表，使用院系编号（facultyNo）和班级编号（classNo）进行分区，并配置OPTIONS属性。
```
CREATE TABLE IF NOT EXISTS student (
    Name        STRING,
    facultyNo   INT,
    classNo     INT
)
USING parquet
PARTITIONED BY (facultyNo, classNo)
OPTIONS (
    compression = 'zstd'
);
```
