全部产品
阿里云办公

创建云数据库(RDS/DRDS)维表

更新时间:2018-09-29 16:34:52

云数据库 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数据存储类型),示例代码如下。

  1. CREATE TABLE rds_dim_table(
  2. id int,
  3. len int,
  4. content VARCHAR,
  5. PRIMARY KEY (id),
  6. PERIOD FOR SYSTEM_TIME--定义维表的变化周期,表明该表是一张会变化的表。
  7. ) with (
  8. type='rds',
  9. url='jdbc:mysql:XXXXXXXXXX',
  10. tableName='test4',
  11. userName='test',
  12. password='XXXXXX'
  13. );

注意:声明一个维表时,必须要指名主键。维表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,请特别注意节点的内存,防止内存溢出。

测试案例

  1. CREATE TABLE datahub_input1 (
  2. id BIGINT,
  3. name VARCHAR,
  4. age BIGINT
  5. ) WITH (
  6. type='datahub'
  7. );
  8. create table phoneNumber(
  9. name VARCHAR,
  10. phoneNumber bigint,
  11. primary key(name),
  12. PERIOD FOR SYSTEM_TIME--定义维表的变化周期
  13. )with(
  14. type='rds'
  15. );
  16. CREATE table result_infor(
  17. id bigint,
  18. phoneNumber bigint,
  19. name VARCHAR
  20. )with(
  21. type='rds'
  22. );
  23. INSERT INTO result_infor
  24. SELECT
  25. t.id
  26. ,w.phoneNumber
  27. ,t.name
  28. FROM datahub_input1 as t
  29. JOIN phoneNumber FOR SYSTEM_TIME AS OF PROCTIME() as w --维表JOIN必须指定
  30. ON t.name = w.name;

关于维表详细语法请参见维表JOIN语法