CTAS(Create Table As Select)支持通过查询方式进行建表和表数据复制,目标表必须是实时写入表。
CTAS在系统内部处理时,分为如下几个步骤:
- Step 1: 执行CREATE TABLE建表,和其他实时表建表步骤一致
- Step 2: 执行实时表的LOAD DATA表上线操作
- Step 3: 执行INSERT from SELECT操作,关于INSERT from SELECT介绍,请参考 :ref:insert-from-select
- Step 4: 执行实时表的Merge Baseline,对刚刚INSERT的实时数据进行基线合并
Note
- 目前AnalyticDB并不保证CTAS整体操作流程的原子性,其中,建表(Step 1)、表上线(Step 2)都是原子的,如果失败,表会回滚
- 然而INSERT from SELECT实时数据写入(Step 3并不保证成功,可能出现数据部分插入成功的状态,业务使用CTAS时,需要从业务应用角度考虑-在ETL流程中使用CTAS(包括INSERT from SELECT),一种保证业务完整性的做法是通过向目标表插入标记数据的方法:INSERT from SELECT时,向目标表插入一条标记数据
- 执行实时表的FLUSH操作
- 查询标记数据,保证标记数据入库成功,如果未成功,可结合业务情况,考虑删表和重试操作
CTAS中完全定义列的情况下,语法示例:<PRE prettyprinted? linenums>
- CREATE TABLE IF NOT EXISTS weitao.table1 (
- user_id long COMMENT 'user ID',
- seller_id long COMMENT 'seller ID',
- follow_id long COMMENT 'user_id follower',
- score double COMMENT 'user_id score',
- interest_flag multivalue COMMENT 'multiple value column' delimiter ',',
- primary Key (user_id, seller_id)
- )
- PARTITION BY HASH KEY(user_id) PARTITION NUM 128
- CLUSTERED BY (follow_id,score)
- TABLEGROUP weitao_group12
- SELECT * FROM db1.table1 WHERE col1 = 3;
其中,指定 IF NOT EXISTS 时,当目标表已经存在时,不报错。
CTAS中不定义列的情况下,语法示例:<PRE prettyprinted? linenums>
- CREATE TABLE bar (PRIMARY KEY (n)) SELECT n FROM foo;
其中,目标表不指定列定义,则列定义采用SELECT子句中返回的列名和列定义,但是主键必须定义。