描述
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 PARQUETOPTIONS ('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 CSVCOMMENT '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 PARQUETPARTITIONED 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_copyUSING PARQUETLOCATION '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;