维表 Join

维表是指一张数据不断变化的表,对应到实时计算上的具体需求是:用户需要在流计算过程中进行流数据和外部存储维表数据的 JOIN,从而得到完整的输出数据。这里会涉及到维表的快照的概念,即:在 JOIN 的瞬间只会对维表当前时间数据做关联。

随着用户对实时数据维表 JOIN 需求的激增,我们在实时数仓版本中提供了功能更丰富,易用性更强的维表 JOIN,旨在让用户使用起来更便捷,更顺手。

维表 JOIN 的使用

目前提供了四种存储的维表 JOIN 功能:

JDBC

Redis

HBase

Arctic

维表 JOIN 的 SQL 语句分为两部分:SET 语句和 JOIN 语句。

1. SET 语句

SET 语句是用来规定维表 JOIN 过程中本地缓存的设置,是可选项。本地缓存的作用是将每一次查询到的维表数据缓存在本地,当下一次数据查询的时候会优先查询本地缓存是否存在已有数据,如果有则立即返回。如果没有才会去外部存储维表查询数据,本地缓存会根据用户设置的过期时间定时过期数据。

本地缓存的优点是:数据返回速度快,减少了去外部存储查询的开销。当然缺点也相对明显:缓存数据更新不及时,会产生错误的返回结果,这点对于增量索引的用户来说尤为致命。所以用户要根据维表的具体特点决定是否使用 SET 语句进行本地缓存的设置。

SET 语法写法如下:

-- 可选设置项 --

SET '<dim_table_name>.connector.lookup.cache.max-rows' = [number_value]; 

//开启本地缓存并设置缓存的维表数据最大个数,在缓存没有过期之前,join的数据会先从本地缓存取出

SET '<dim_table_name>.connector.lookup.cache.ttl' = [number_value]; 

//设置本地缓存数据的过期时间,单位ms

注:增量索引任务一定不要设置本地缓存,会导致 JOIN 老数据。

例子:

SET 'Music_Mlog.connector.lookup.cache.max-rows' = 10000;
SET 'Music_Mlog.connector.lookup.cache.ttl' = 120000;

这里规定维表 JOIN 的时候,从 Music_Mlog 表中查询并缓存到本地的数据最大不超过10000个,缓存过期时间为120s。

2.JOIN语句

不同存储的维表 JOIN 语句会有不同,具体写法会在下面篇章分别进行介绍。