开发者社区> 问答> 正文

LM计算引擎 CTAS是什么?

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>
  1. CREATE TABLE IF NOT EXISTS weitao.table1 (
  2.   user_id long COMMENT 'user ID',
  3.   seller_id long COMMENT 'seller ID',
  4.   follow_id long COMMENT 'user_id follower',
  5.   score double COMMENT 'user_id score',
  6.   interest_flag multivalue COMMENT 'multiple value column' delimiter ',',
  7.   primary Key (user_id, seller_id)
  8. )
  9. PARTITION BY HASH KEY(user_id) PARTITION NUM 128
  10. CLUSTERED BY (follow_id,score)
  11. TABLEGROUP weitao_group12
  12. SELECT * FROM db1.table1 WHERE col1 = 3;

其中,指定 IF NOT EXISTS 时,当目标表已经存在时,不报错。
CTAS中不定义列的情况下,语法示例:<PRE prettyprinted? linenums>
  1. CREATE TABLE bar (PRIMARY KEY (n)) SELECT n FROM foo;

其中,目标表不指定列定义,则列定义采用SELECT子句中返回的列名和列定义,但是主键必须定义。

展开
收起
nicenelly 2017-10-26 15:23:01 1723 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
基于 Flink SQL + Paimon 构建流式湖仓新方 立即下载
《基于Apache Hudi的CDC数据入湖》 立即下载
MaxCompute SQL 2.0 全新的计算引擎 立即下载