云数据库 RDS 版
阿里云关系型数据库(Relational Database Service,简称 RDS)是一种稳定可靠、可弹性伸缩的在线数据库服务。基于阿里云分布式文件系统和高性能存储,RDS 支持 MySQL、SQL Server、PostgreSQL 和 PPAS(Postgre Plus Advanced Server,一种高度兼容 Oracle 的数据库)引擎,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。
注意:
云数据库(RDS/DRDS)插件中的WITH参数一致,可以通用。
在使用云数据库(RDS/DRDS)作为维表时,RDS或DRDS中必须要有真实的表存在。
DDL定义
实时计算支持使用RDS/DRDS作为维表(注意:目前仅支持MySQL数据存储类型),示例代码如下。
CREATE TABLE rds_dim_table(
id int,
len int,
content VARCHAR,
PRIMARY KEY (id),
PERIOD FOR SYSTEM_TIME--定义维表的变化周期,表明该表是一张会变化的表。
) with (
type='rds',
url='jdbc:mysql:XXXXXXXXXX',
tableName='test4',
userName='test',
password='XXXXXX'
);
注意:声明一个维表时,必须要指名主键。维表JOIN的时候,ON的条件必须包含所有主键的等值条件。RDS/DRDS的主键可以定义为表的主键或是唯一索引列。
WITH参数
参数 | 注释说明 | 备注 |
---|---|---|
url | 地址 | RDS的URL链接地址 |
tableName | 表名 | 无 |
userName | 用户名 | 无 |
password | 密码 | 无 |
maxRetryTimes | 最大尝试插入次数 | 可选,默认为3 |
Cache 参数
参数 | 注释说明 | 备注 |
---|---|---|
cache | 缓存策略 | 默认 None , 可选 LRU , ALL 。 |
cacheSize | 缓存大小 | 当选择 LRU 缓存策略后,可以设置缓存大小,默认 10000 行。 |
cacheTTLMs | 缓存超时时间,单位毫秒。 | 当选择 LRU 缓存策略后,可以设置缓存失效的超时时间,默认不过期。当选择 ALL 策略,则为缓存reload 的间隔时间,默认不重新加载。 |
cacheReloadTimeBlackList | ALL Cache 时启用,更新时间黑名单,防止在此时间内做cache 更新(如双11场景)。 |
可选,默认空,格式为2017-10-24 14:00 -> 2017-10-24 15:00, 2017-11-10 23:30 -> 2017-11-11 08:00 。用逗号(,)来分隔多个黑名单,用箭头(->)来分割黑名单的起始结束时间。 |
目前RDS/DRDS提供如下三种缓存策略。
- None:无缓存。
- LRU:最近使用策略缓存。需要配置相关参数:缓存大小(cacheSize)和 缓存超时时间(cacheTTLMs)。
- ALL:全量缓存策略。在Job运行前会将远程表中所有数据load到内存中,之后所有的维表查询都会通过 cache进行。cache命中不到则不存在,并在缓存过期后重新加载一遍全量缓存。全量缓存策略适合远程表数据量小、miss key多的场景。全量缓存相关配置:缓存更新间隔(cacheTTLMs),更新时间黑名单(cacheReloadTimeBlackList)。
注意:
- 因为会异步reload,使用cache all的时候,需要将维表JOIN的节点增加一些内存,增加的内存大小为远程表两倍的数据量。
- 使用CACHE ALL,请特别注意节点的内存,防止内存溢出。
测试案例
CREATE TABLE datahub_input1 (
id BIGINT,
name VARCHAR,
age BIGINT
) WITH (
type='datahub'
);
create table phoneNumber(
name VARCHAR,
phoneNumber bigint,
primary key(name),
PERIOD FOR SYSTEM_TIME--定义维表的变化周期
)with(
type='rds'
);
CREATE table result_infor(
id bigint,
phoneNumber bigint,
name VARCHAR
)with(
type='rds'
);
INSERT INTO result_infor
SELECT
t.id
,w.phoneNumber
,t.name
FROM datahub_input1 as t
JOIN phoneNumber FOR SYSTEM_TIME AS OF PROCTIME() as w --维表JOIN必须指定
ON t.name = w.name;
关于维表详细语法请参见维表JOIN语法。
本文转自实时计算——创建云数据库(RDS/DRDS)维表