CREATE TABLE AS SELECT

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

我的收藏

描述

CREATE TABLE AS SELECT(简称 CTAS)基于查询结果创建一个新表并填充数据。新表将包含查询结果中的所有列和数据。
说明:
由于 TCI 提供的 SDK 暂时不支持 CTAS 的原子性保证操作,因此 CTAS 为非原子性操作(non-atomic)。如果 CTAS 执行过程中失败,可能会残留部分写入的数据。

语法

CREATE [ OR REPLACE ] TABLE table_identifier
[ ( col_name1 col_type1 [ NOT NULL ], ... ) ]
USING tci
[ PARTITIONED BY ( partition_expr [ , ... ] ) ]
[ TBLPROPERTIES ( 'key' = 'value', ... ) ]
AS select_statement

参数说明

子句/关键字
用途
说明
OR REPLACE / REPLACE TABLE
表存在时替换内容(RTAS)
替换保留历史快照记录,同时更新 Schema 和分区规范
select_statement
生成新表数据的 SELECT 查询
查询结果决定新表 Schema(除非显式指定列定义)

注意事项

非原子性:TCI 当前不支持原子性保证,执行失败时可能有残留数据。
CTAS 创建的新表不会自动继承源表的分区规范和表属性,需显式指定 PARTITIONED BYTBLPROPERTIES
使用 RTAS 时,Schema 和分区规范会被替换;如不想改变 Schema,应改用 INSERT OVERWRITE
RTAS 中指定的表属性会与现有表属性合并,相同 key 会更新为新值。
不支持 EXTERNALLOCATION 子句。

示例

准备源表及数据

CREATE TABLE tci_ctas_source (
id INT,
name STRING,
score DOUBLE
) USING tci;

INSERT INTO tci_ctas_source
VALUES (1, 'Alice', 95.5), (2, 'Bob', 88.0), (3, 'Charlie', 92.3);

CTAS 基本用法

CREATE TABLE tci_ctas_basic
USING tci
AS SELECT * FROM tci_ctas_source;

CTAS 复杂用法:分区规则与排序键配置

CREATE TABLE tci_ctas_part_prop
USING tci
PARTITIONED BY (bucket(4, id))
TBLPROPERTIES ('sort-order' = 'name')
AS SELECT id, name, score FROM tci_ctas_source;

验证 CTAS 数据正确性

SELECT count(*) FROM tci_ctas_basic;

SELECT * FROM tci_ctas_basic ORDER BY id;

DESCRIBE tci_ctas_part_prop;

RTAS 使用示例

-- 先创建目标表
CREATE TABLE tci_rtas_target (
id INT,
name STRING
) USING tci;

INSERT INTO tci_rtas_target VALUES (10, 'OldData');

-- RTAS 替换
REPLACE TABLE tci_rtas_target
USING tci
AS SELECT id, name FROM tci_ctas_source;

-- 验证 RTAS 结果
SELECT * FROM tci_rtas_target ORDER BY id;