| KW_CREATE opt_external:isExternal KW_TABLE opt_if_not_exists:ifNotExists table_name:name
LPAREN column_definition_list:columns COMMA index_definition_list:indexes RPAREN opt_engine:engineName
opt_keys:keys
opt_comment:tableComment
opt_partition:partition
opt_distribution:distribution
opt_rollup:index
opt_properties:tblProperties
opt_ext_properties:extProperties
{:
RESULT = new CreateTableStmt(ifNotExists, isExternal, name, columns, indexes, engineName, keys, partition,
distribution, tblProperties, extProperties, tableComment, index);
:}
CreateTableStmt最终解析出的属性如下所示:
protected TableName tableName; // 表名
protected List<ColumnDef> columnDefs; // 列定义
private List<IndexDef> indexDefs; // 索引定义
protected PartitionDesc partitionDesc; // 分区信息
protected DistributionDesc distributionDesc; // 分桶方式
protected KeysDesc keysDesc; // 数据模型
protected Map<String, String> properties; // 属性
private String comment; // 评论
private List<AlterClause> rollupAlterClauseList = Lists.newArrayList(); // rollup
建表执行
总体视角
创建时序图 - createOlapTable
细化过程
排序key选择逻辑Env.calcShortKeyColumnCount
默认最多3个排序字段,遍历每个key字段
● 如果加上此字段,key长度超过36个字节
● 如果是char家族,这个字段算
● 如果不是char家族,这个字段不算
● 如果加上此字段,key长度没有36个字节
● 如果是varchar:这个字段算,退出
● 否则这个字段算
表结构细化
每个分区下都存在相同索引
每个索引下都存在相同数量Tablet
Tablet总数为:分区数*索引数*分桶数
Replica总数为:
BE选择逻辑
每个(Partition, Rollup, Tablet)组合根据副本数去选择BE存放副本
RPC逻辑
每个(Partition, Rollup)把下面累积的CreateReplicaTask组装到AgentBatchTask中并通过AgentTaskExecutor发送