一、描述
CREATE TABLE 语句使用数据源定义一个新表。
二、语法
CREATE TABLE [ IF NOT EXISTS ] table_identifier [ ( col_name1 col_type1 [ COMMENT col_comment1 ], … ) ] USING data_source [ OPTIONS ( key1=val1, key2=val2, … ) ] [ PARTITIONED BY ( col_name1, col_name2, … ) ] [ CLUSTERED BY ( col_name3, col_name4, … ) [ SORTED BY ( col_name [ ASC | DESC ], … ) ] INTO num_buckets BUCKETS ] [ LOCATION path ] [ COMMENT table_comment ] [ TBLPROPERTIES ( key1=val1, key2=val2, … ) ] [ AS select_statement ]
注意:USING 子句和 AS SELECT 子句之间的子句可以以任意顺序出现。例如,可以在 TBLPROPERTIES 之后写 COMMENT table_comment。
三、参数说明
| 子句/关键字 | 用途 | 说明 |
| table_identifier | 表名定义 | 指定表名,可选择性地用数据库名进行限定。语法:[database_name.]table_name |
| USING data_source | 数据源格式 | 指定创建表的输入格式(数据源),支持 CSV、TXT、ORC、JDBC、PARQUET 等 |
| OPTIONS | 数据源选项 | 数据源的配置选项,将注入到存储属性中 |
| PARTITIONED BY | 分区 | 根据指定的列对表进行分区 |
| CLUSTERED BY | 分桶 | 根据指定的列将创建的分区内的数据分桶为固定数量的桶。注意:分桶是一种优化技术,使用桶和分桶列来确定数据分区并避免数据混洗(Shuffle) |
| SORTED BY | 桶内排序 | 指定桶内数据的排序顺序。可在列名后使用 ASC(升序)或 DESC(降序),未指定时默认为 ASC |
| INTO num_buckets BUCKETS | 桶数量 | 指定分桶的数量,必须配合 CLUSTERED BY 子句一起使用 |
| LOCATION | 存储路径 | 表数据存储的目录路径,可以是分布式存储(如 HDFS、S3 等)上的路径 |
| COMMENT | 表注释 | 用于描述表的字符串字面量 |
| TBLPROPERTIES | 表属性 | 用于标记/配置表定义的键值对列表 |
| AS select_statement | CTAS 建表 | 使用 SELECT 语句查询结果的数据直接填充并创建表 |
四、示例
— 使用 CSV 数据源CREATE EXTERNAL TABLE student_ds1 (id INT, name STRING, age INT) USING CSV LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds1';– 使用 PARQUET 数据源CREATE EXTERNAL TABLE student_ds2 (id INT, name STRING, age INT) USING PARQUET LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds2';– 默认数据源(parquet)CREATE EXTERNAL TABLE student_ds3 (id INT, name STRING, age INT) LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds3';– 带 OPTIONSCREATE EXTERNAL TABLE student_ds4 (id INT, name STRING, age INT) USING PARQUET OPTIONS ('parquet.bloom.filter.enabled'='true') LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds4';– 带 COMMENT + TBLPROPERTIESCREATE EXTERNAL TABLE student_ds5 (id INT, name STRING, age INT) USING CSV COMMENT 'test table with comment' TBLPROPERTIES ('foo'='bar') LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds5';– 分区表 PARTITIONED BYCREATE EXTERNAL TABLE student_ds6 (id INT, name STRING, age INT) USING PARQUET PARTITIONED BY (age) LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds6';– IF NOT EXISTSCREATE EXTERNAL TABLE IF NOT EXISTS student_ds1 (id INT, name STRING, age INT) USING CSV LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds1';– INSERT 数据并验证INSERT INTO student_ds2 VALUES (1, 'Alice', 20), (2, 'Bob', 22);SELECT * FROM student_ds2;– CTAS(CREATE TABLE AS SELECT)+ LOCATIONCREATE TABLE student_ds_copy USING PARQUET LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds_copy_v2' AS SELECT * FROM student_ds2;– 使用 ORC 数据源CREATE EXTERNAL TABLE student_ds7 (id INT, name STRING, age INT) USING ORC LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds7';– 使用 JSON 数据源CREATE EXTERNAL TABLE student_ds8 (id INT, name STRING, age INT) USING JSON LOCATION 'cosn://<your_cos_bucket>/test_create_table_ds/student_ds8';– DESC TABLEDESC TABLE EXTENDED student_ds2;