如何创建一张表

CeresDB 是一个 Schema-less 的时序数据引擎,你可以不必创建 schema 就立刻写入数据(CeresDB 会根据你的第一次写入帮你创建一个默认的 schema)。 当然你也可以自行创建一个 schema 来更精细化的管理的表(比如索引等)

表规范

CeresDB 的表要有以下约束:

  • 必须包含主键
  • 必须包含时间列
  • 主键必须包含时间列,并且只能包含一个时间列,该时间列为主时间列(默认时间列)
  • 主键列必须是非空列,因此,时间列也必须是非空列
  • 可以指定若干 tag 列

主时间列

每个表都必须要有一个主时间列,用来映射到时序数据里的时间戳,如 opentsdb/prometheus 里的 timestamp 。建表时,用户必须指定表中一个 Timestamp 类型的列为主时间列,该列会自动映射到 opentsdb/prometheus 等协议里的 timestamp 。需要注意的是,主时间列的名字可以自定义,不需要一定叫 timestamp

约束和选项

建表语句可以

  • 通过 PRIMARY KEY 约束指定主键
  • 通过 TIMESTAMP KEY 约束指定主时间列(默认时间列)
  • 通过 TAG 选项指定 tag 列

上述约束可以全大写或者小写,在建表后均不可修改

建表例子

  1. 指定 primary key 为 (c1, ts) ,这是一个复合主键。同时,指定主时间列为 ts
CREATE TABLE with_primary_key(
    ts TIMESTAMP NOT NULL,
    c1 STRING NOT NULL,
    c2 STRING NULL,
    c3 DOUBLE NULL,
    c4 STRING NULL,
    c5 STRING NULL,
    TIMESTAMP KEY(ts),
    PRIMARY KEY(c1, ts)
) ENGINE=Analytic WITH (ttl='7d');
  1. 指定 primary key 为 (c1, ts),指定主时间列为 ts ,指定 tag 为 c1,c2,c2。另外,可以注意到允许有其他时间戳列,这个列作为普通的数据列存在。
CREATE TABLE with_primary_key_tag(
    ts TIMESTAMP NOT NULL,
    c1 STRING TAG NOT NULL,
    c2 STRING TAG NULL,
    c3 STRING TAG NULL,
    c4 DOUBLE NULL,
    c5 STRING NULL,
    c6 STRING NULL,
    c7 TIMESTAMP NULL,
    TIMESTAMP KEY(ts),
    PRIMARY KEY(c1, ts)
) ENGINE=Analytic WITH (ttl='7d');
  1. 部分场景下,可能用户并没有指定主键,但是会指定 tags 。这种情况下,会隐式地为用户创建一个叫 tsid 的列,并自动地设置主键为 (tsid, timestamp) 其中 timestamp 为用户的主时间列,而 tsid 则是通过 tags 哈希生成。本质上这也是一种自动生成 id 的机制
CREATE TABLE with_tag(
    ts TIMESTAMP NOT NULL,
    c1 STRING TAG NOT NULL,
    c2 STRING TAG NULL,
    c3 STRING TAG NULL,
    c4 DOUBLE NULL,
    c5 STRING NULL,
    c6 STRING NULL,
    TIMESTAMP KEY(ts)
) ENGINE=Analytic WITH (ttl='7d');

因此,实际逻辑上该语句会变成类似以下形式的语句(注意并不存在这种语法)

CREATE TABLE with_tag(
    tsid AUTO_HASH_BY_TAGS,
    ts TIMESTAMP NOT NULL,
    c1 STRING TAG NOT NULL,
    c2 STRING TAG NULL,
    c3 STRING TAG NULL,
    c4 DOUBLE NULL,
    c5 STRING NULL,
    c6 STRING NULL,
    TIMESTAMP KEY(ts),
    PRIMARY KEY(tsid, ts)
) ENGINE=Analytic;

DESCRIBE TABLE

DESCRIBE TABLE MY_FIRST_TABLE

ALTER TABLE

ALTER TABLE MY_FIRST_TABLE ADD COLUMN col_20 UINT64

EXISTS TABLE

EXISTS [TABLE] xxx_table