CREATE TABLE USING DATASOURCE

最近更新时间:2026-05-20 14:11:22

我的收藏

描述

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';

-- 带 OPTIONS
CREATE 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 + TBLPROPERTIES
CREATE 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 BY
CREATE 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 EXISTS
CREATE 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)+ LOCATION
CREATE 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 TABLE
DESC TABLE EXTENDED student_ds2;