在维表DDL语法中增加1行PERIOD FOR SYSTEM_TIME的声明,定义维表的变化周期,即可使用标准的CREATE TABLE语法定义实时计算维表。

示例

CREATE TABLE white_list (
  id varchar,
  name varchar,
  age int,
  PRIMARY KEY (id),
  PERIOD FOR SYSTEM_TIME  --定义维表的变化周期。实时计算3.x及以上版本,维表DDL中可以不声明该句,在维表JOIN时,声明FOR SYSTEM_TIME AS OF PROCTIME()即可。
) with (
  type = 'RDS',
  ...
);
说明
  • 维表必须指定主键。维表JOIN时,ON的条件必须包含所有主键的等值条件。
  • 目前仅支持源表INNER JOINLEFT JOIN维表。
  • 维表的唯一键(UK)必须为数据库表中的唯一键。如果维表声明的唯一键不是数据库表的唯一键会产生以下影响:
    • 维表的读取速度变慢。
    • 在维表JOIN时,会从第一条数据进行JOIN,在加入Job的过程中,相同KEY的多条记录在数据库中按顺序发生变化,可能导致JOIN结果错误。

INDEX语法

说明 建议在实时计算2.2.7及以上版本使用INDEX语法。
实时计算2.2以下版本,维表定义要求声明PRIMARY KEY,这种情况下只能实现一对一连接。为支持一对多连接的需求,引入了INDEX语法。非Cache All的维表JOIN通过INDEX LOOKUP的方式实现一对多连接的需求。
CREATE TABLE Persons (
    ID bigint,
    LastName varchar,
    FirstName varchar,
    Nick varchar,
    Age int,
    [UNIQUE] INDEX(LastName,FirstName,Nick), --定义INDEX,不需要指定具体的类型,例如,fulltext或clustered等。
    PERIOD FOR SYSTEM_TIME
) with (
  type='RDS',
  ...
);
UNIQUE INDEX表示一对一连接,而INDEX表示一对多连接。
说明
  • 实时计算2.2.7及以后版本支持UNIQUE CONSTRAINTUNIQUE KEY),实时计算2.2.7以下版本可以使用PRIMARY KEY的定义。
  • 在生成执行计划时,引擎优先采用UNIQUE INDEX。即如果DDL中使用INDEX,但JOIN等值连接条件中同时包含UNIQUENON-UNIQUE INDEX时,优先使用UNIQUE INDEX查找右表数据。
  • 支持一对多连接的维表类型,例如RDS和MaxCompute(仅支持Cache All模式,不支持随机访问)。
  • 您可以增加maxJoinRows参数,表示在一对多连接时,左表一条记录连接右表的最大记录数(默认值为1024)。在一对多连接的记录数过多时,可能会极大的影响流任务的性能,因此您需要增大Cache的内存(cacheSize限制的是左表key的个数)。
  • 表格存储Tablestore和Hologres维表不支持使用INDEX进行一对多JION。

维表、源表和结果表的区别

类别 源表 结果表 维表
是否能驱动计算
是否能读取数据 是,直接读取。 是,仅通过源表和维表JOIN读取。
是否能写入数据
是否支持Cache