blink中的维度表
请各位哥哥姐姐弟弟妹妹注意一下哈,这边文章内容版本如下:
blink:3.3.0
rds:5.x
如果大家使用的是不同版本出现了问题,可在移步阿里云官网或者下面评论区或者私信我,一起探讨研究下~~不胜感激Thanks♪(・ω・)ノ
一、组件介绍
blink是阿里云计算实时计算平台的重要产品,基本上实时业务都运行在blink上。blink在开源flink的基础上新增了bayes页面,面向业务大于开发,所以基本不会有太复杂的技术操作。并且blink支持在bayes页面上新建sql脚本来执行流计算作业。使用起来较为方便。
二、维度表
离线场景(批计算):在离线数仓中,维度表的使用较为频繁,并且批处理中,join的双方数据都是确定的,具有可重执行性。所以一般离线join和普通mysql的语法一致。
实时场景(流计算):在流计算中,维表的使用目的基本和离线一致,也是为了匹配关键字从而对原数据进行一些字段的补充或者修补。在实时数仓或者实时任务中,一般不轻易引进维表的使用,原因有三:
①是维表的使用可能会降低流计算的效率;
②是如果维表是实时变化的,那么维表的匹配规则需要业务上的一致敲定;
③是因为维表是变化的,所以不具有可重执行性,数据无法回补。
三、blink可用维度表的类型
这里只会罗列一些组件来作为维度表,不会展开描述,如果对这部分组件不太熟悉或者有兴趣了解可以移步阿里云官网进行简单的熟悉。因为这些组件只是产品,了解大致功能即可。
在开源环境中一般会使用hbase来作为维表做实时的匹配组件。
①原因:在开源环境中,如果维度表是变化的,那么实时数据来和维表做匹配的时候,如果维表所依赖的组件写入和查询速度不匹配或者写入速度慢于查询速度,那么实时数据做匹配就会匹配到旧的数据信息;
②解决:所以会选择hbase来作为维度表的组件,因为hbase写入和查询之前的延迟相对较小,基本可以保证实时流数据匹配的维表信息是近实时的;
01)交互式分析hologres
02)表格存储tableStore(OTS)
03)事务数据库RDS
04)数据库Hbase
05)批处理计算MaxCompute
06)数据库Redis
07)查询分析ElasticSearch
08)Phoenix5
09)分析型数据库ADB
10)数据库Oracle
四、Rds维度表的使用
01)blink创建源数据
CREATE TABLE source_table (
log_time VARCHAR,
v_id VARCHAR,
url VARCHAR,
hh VARCHAR,
ds VARCHAR
) WITH (
type = 'datahub',
endPoint = 'http://enjoy.keino.com',
accessId='keino',
accessKey='handsome',
project = 'keino_hanesome',
topic = 'outstanding',
batchReadSize = '1000'
);
02)在对应数据库中创建rds表
CREATE TABLE `dim_blink_vary` (
`demo_01` varchar(50) NOT NULL,
`demo_02` varchar(50) NOT NULL,
`score` double DEFAULT NULL,
`demo_01` varchar(50) NOT NULL,
`rk` bigint,
PRIMARY KEY (`demo_01`,`demo_02`,`demo_01`),
KEY `ids` (`demo_01`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
03)blink中创建维度表
温馨提示
blink中维度表匹配有一个必须遵循的条件,为了提高匹配效率,
实时数据和维表匹配的关键字必须是primary key或者unique key。
01)一对一匹配
CREATE TABLE dim_blink_vary (
demo01 VARCHAR,
demo02 VARCHAR,
score DOUBLE,
demo03 VARCHAR,
rk bigint,
PRIMARY key (demo01),
PERIOD FOR SYSTEM_TIME
) WITH (
type= 'rds',
url = 'jdbc:mysql://11.22.33.44/demo',
userName = 'keino',
password = 'handsome',
tableName = 'dim_blink_vary',
);
如果只是一对一匹配场景,那么申明维表的代码如上。和其他的表引用基本一直。
PERIOD FOR SYSTEM_TIME:这个标识代表维表是实时变化。
02)一对多匹配
CREATE TABLE dim_blink_vary (
demo01 VARCHAR,
demo02 VARCHAR,
score DOUBLE,
demo03 VARCHAR,
rk bigint,
INDEX(main_item),
PERIOD FOR SYSTEM_TIME
) WITH (
type= 'rds',
url = 'jdbc:mysql://11.22.33.44/demo',
userName = 'keino',
password = 'handsome',
tableName = 'dim_blink_vary',
maxJoinRows = '100'
);
1)如果是一对多匹配的话,需要使用index来声明join关键字。
2)为了提高实时计算匹配信息效率,加入了参数maxJoinRows,代表最多匹配几次。也就是说,如果前提已经知道一条数据对应的维度信息最多n条,那么这里就可以直接把maxJoinRows=‘n’
03)加入缓存机制的匹配
因为这里场景是维度表变化更新的,所以没有设置缓存机制。如果维表变化更新的话,缓存机制是不适用的。如果想了解缓存机制,可以移步阿里云官网了解
维表缓存机制.
04)blink中创建下游表
create table pprint(
demo01 varchar,
demo02 varchar,
demo03 varchar
)with(
type = 'print'
);
05)blink关联rds维表并写入下游
insert into pprint
select
tb_a.v_id as demo01,
tb_b.demo01,
tb_b.demo02
from
source_table as tb_a
join dim_blink_vary FOR SYSTEM_TIME AS OF PROCTIME() as tb_b
on tb_a.v_id = tb_b.demo01;
FOR SYSTEM_TIME AS OF PROCTIME()
代表这个维表在匹配中是处于实时变化更新的。
五、致哥哥姐姐弟弟妹妹
本文只总结了blink中rds作为维度表的使用。可能有些地方没有介绍详细,如果有疑惑或者使用中有问题的话,可以先移步阿里云官网了解,也可以在评论区或者私信~~大家一起进步!!
感谢您用宝贵的时间阅读本文,希望可以帮到您~不胜感激Thanks♪(・ω・)ノ