00:00
接下来我们来介绍flink CQ当中的连接查询连接,也就是平常我们所熟悉的状,在标准CQ里边,那我们都知道是可以将多个表连接合并起来的,那一般情况我们可以做所谓的inner join内连接,也可以做各种各样的啊,左外连接,右外连接,全外连接等等等等。主要的目的就是因为我们一般在设计表的时候,关系型表里边我们是要依赖于主键,避免数据的冗余和更新的异常啊,那所以一般情况我们都要把表格的设计进行拆分,比如说哎,我们有一个商品的订单信息,那么订单表里边就只会保存商品的ID,而不会保存商品的详情,那如果要是保存商品的详情的话,我们就应该要到商品表对应的里面去进行查询啊,那这样的话,我们只用主键把它们关联起来,这样就可以保证当前数据是足够简洁,而且进行更新的时候只需要更新一个地方就可以,这是我们非常熟悉的。
01:12
关系型数据库里面表的设计方式啊,那所以这个时候如果我们想要查询更多信息的话,那就需要把表进行join用啊,在link CQ里边呢,当然也是支持各种各样的连接查询的,那操作的对象就不再是我们所熟悉的像MYQ,像Oracle里边的这样的数据库,而是动态啊,那所以在流处理里边,其实我们这个动态表的draw就对应着两条流的连接状语的操作,所以整体来讲跟t streamam API里边的。状语的过程是非常相似的,只不过这里边呢,我们要用CQ去实现啊,所以本质上这一部分呢,又可以跟CQ里边的状语连接。进行。
02:00
啊,所以连接这一部分,Draw这一部分呢,我们可以分为常规连接查询和间隔连接查询,常规连接查询的话,那这一部分其实就是CQ里边原定的方式了,那另外的间隔接查询就是在flink CQ当中相关的比较有特色的。Draw影连接方式,那首先我们来看常规连接查询,常规连接查询简单来讲,那其实就是我们所熟悉的CQ里边的draw。就是内连接和外连接了draw和al draw那去跟。标准CQ的区别在于这个CQ当中进行。连接查询draw查询得到的结果也是动态表。而且随着。原始的连接的做连接操作的两张表里边的数据进行更改,结果的动态表里边的数据也会进行更新,所以连接查询的一般情况结果是一个更新查询,那在目前flink CQ的版本当中是仅支持等值条件作为连接的条件,也就是说我们在写这个CQ。
03:17
Select from某张表,然后in the某另外一张表的时候,后面加上on on关键字,跟上一个连接查询的条件,这个条件只能是相等的这样的一个表达式啊,那所以在这里又简单的可以分成等值的内连结和等值的外连接。那主要区分就是inner drawing和al drawing了,主要呃,就看结果表里边是否包含落单的,没有办法符合连接条件的那些行,如果不包含的话,当前我们就是inner join,包含的话当然就是alter drawing了。比如说我们提到如果当前我们有一个订单表,还有一个商品表,他们两个需要去做连接操作的话,那我们现在CQ也非常的简单,跟里啊,我们所熟悉的那种写法是一样的,Select order draw order product I。
04:15
等于点ID,那所以就是说让两张表里边的相同的商品连接,以它为为条件连接在一起得到一个。两张表和合并之后的另外的一张动态表啊,那得到结果呢,就有包含了当前订单,每一个订单里边所对应的详细数据,包含了商品的详情。那另外一种呢,就是等值外连接,等值外连接al draw,其实也就是说直接返回符合连接条件所有行的,此外呢,将那些不符合连接条件的落单的那些航也都单独返回。目前在fliq里边也仅支持等值的连接条件,就是on后面加上一个什么等于什么,比如说我们这里可以使用啊,Left join product啊,那这样的话在得到的结果表里边就会。
05:14
得到的结果里边就会除了当前匹配起,就是对应的I单里I等的那些数据之外,还应该有订单里边其他的所有数据,因为我们是product表。那当然了,如果是draw表的话,那就应该包含了。匹配起来的连接起来的所有的数据,另外还包含了表里的所有数据。当然如果要是full Joy全麦的话,那就相当于包含了两张表里的所有数据,这和标准CQ里完全一样。那另外一部分呢,我们这里面关键要看在flink CQ里边跟处理相关的比较特殊的。
06:01
一些连接查询操作啊,这一部分可能是我们在平常项目当中应用更加广泛的,这里主要就涉及到了PI给我们提供的双流,包括窗口连接和间隔连接。所说的window和要注意现在目前的fliq还不支持window,但是它支持了间隔连接internal,所以这部分隔连接查询可以完全比照之前data stream API里边的来进行理解,它们本质是完全一样的。那间隔连接查询返回的呢?同样是符合约束条件的。两张表当中数据的抵卡级,只不过这里面的连接条件,除了我们常规的这个连接条件就是什么等于什么之外,还应该要多一个时间间隔的限制,那具体语法呢?呃,主要就是说我们这里边应该有一个两张表的连接,注意这里边是不需要join关键字,只要from后边把两张表列出来,用逗号分割就可以。
07:12
这其实如果用在标准CQL里面的话。标准CQ语言的语法,这样的表示其实是所谓的交叉2CROSS,就是完整的一个笛卡机。那么后边的连接条件呢?我们这里用的是where字句,而不是二啊。本质上来讲,我们知道如果前面用了一个CQ里边前面两张表做了一个交叉连接,然后后边加where子句的话,本质上跟内连接in inner Joy,然后后边加一个on的连接条件是本质上是一样的,所以这一部分跟标准CQ都可以结合起来对照着看。那另外关键的比较特殊的一部分是时间间隔的限制,时间间隔这里边呢,我们是在where子句里边可以用and追加一个限制条件,那这个限制条件呢,就必须要用到。
08:06
所要做状语连接的两张表里面的时间属性字段。这时间属性字段,比如说我们这里边用l time和r time分别表示做连接操作的左右两张表当中的时间属性字段啊,那么我们现在的连接条件就可以有这样的几种形式,比如说l time等于R。就是要求两条数据,它的时间属性,时间戳必须相同,这个时候才能连接在一起。或者呢,也可以l time大于等于r time。并且l time小于r time加上一段时间间隔,比如说INTERVAL10分钟,那这表示什么含义呢?这就代表了我们之前所在data API里面讲解过的时间间隔的含义,就是两边的时间,它只要满足这样的一个不等式。
09:06
左边的时间落在右边时间加减某一个时间间隔范围内,只要符合这个条件就可以连接在一起啊,所以这种方式的话就实现了我们对应的呃,之前所说的internal,当然了,现在这种方式,这相当于是。我们我们之前所定义的那个间隔的上下界,相当于一边是零,另外一边是十分钟,那能不能我们之前那个下界是可以是负的嘛,就相当于。左边l time是可以小于r time的,那这样怎么定义呢?啊,那当然就是定义一个区间了,可以。Time between r time减去。一个十秒的时间间隔and r time加上五秒的。时间间隔,那这样的话,就相当于之前我们标准的对于这个时时间间隔的上下,上下界是负十到正。
10:05
这样的一个定义,间隔连接。一个具体的例子,比如之前我们的订单表order,我们现在呢,比如说除了订单表order之外,还有一个所谓的发货表shipment。意思就是说我们首先客户那边要下订单,这个订单数据写在order表里面,然后接下来呢,针对用客户的订单请求,我们应该要做发货,发货这样一个操作,那么所有的发货信息记录在shipment这张表里。那么要求这两张表有什么关联呢?那就是收到订单之后四个小时之内要发货,诶,那么如果说我们想把这两张表里边满足我们发货时间限制的这些数据要筛选出来的话,那么就可以用一个间隔链接查询设置的时间,我们可以看到当前写写法就是select from order啊,这里重命名一下,它叫o shipment s,然后where里边的ID要相等。
11:09
O order这张表里的ID订单ID要等于shipment这张表里对应的order ID这个字段and后边一个约束条件,那就是直接这个all time要between。Shipment这张表里的shiptime减去四个小时,到当前为止,也就是在之前的呃。说当前下订单的时间应该在发货时间之前的四个小时之内,这样的话,它两者之间的时间间隔就是四个小时啊。在四个小时之内,这就是我们所说的间隔连接查询internal job这样的一种用法啊,那这里我们所需要注意的一点是,因为这里要做的间隔接查询是跟当前的时间属性字有关的,而且这里边time和这个呃,Shifttime明显就是我们当前的时间属性字段了。这个时间。
12:10
那是按照顺序去排列的,我们当前处做流处理的时候,很显然也没有办法时间倒流,那就是当前已经来了的数据,那应该是跟之前已经到达的所有数据去做一个连接操作,然后对应的数据可以输出出来,诶那这这里有一个问题,就是假如说我们发现当前来了的数据要跟之后到达的一些数据也要有对应的这样的一个连接。匹配的输出,那又该怎么办呢?这种方式当然就不太不太直接能够想到该怎么做了,比较复杂了,所以在流处理里面,我们当前的间隔连接查询它是只支持。有,首先我们需要有时间属性字段啊,而且只支持具有时间属性的表,也就是说当前这个两张表只能是不停的在里边去追加新的数据,按照时间顺序在后面不停的追加,然后我跟之前已经来到的所有数据去做一个匹配输出。
13:16
那如果说这里面有更新操作,改了之前的某一个数据的话,那这个我们就不好去做,那能不能这么去做呢?假如有update操作这样的话,我们又怎么去做?对应的这个状语方式呢。CQ里边给我们还支持了一个叫时间连接操作,所谓的时间连接主要是针对版本表而言的version table,这个版本表是一个比较特殊的概念,它主要含义就是说它会随着。时间推移,我们当前这张表有不同的版本,那这个版本表呢,就相当于是把当前我们这张表随着时间的变化全部记录下来,那我们发现这其实本质上就是一个lo啊,而且是将changelo不仅仅是记录成日志,而是把每一次更改之后的那张表都保存下来了。
14:12
所以它其实是具有时间属性,而且还有可能会进行更新操作,但是我们单独拿来看的话,版本表里面的每一个版本它其实都是一个。不进行更新操作的一个固定的表,哎,那所以我们如果要想要去连接某个版本表的时候,那就根据我们当前啊。数据发生的时间,找到对应的当时的那个版本,然后跟当时的那个版本进行一个join连接操作,那这种连接就叫做时间连接啊,这个比较复杂一点。如果感兴趣的话,可以查阅官网的资料,里边有比较详尽的介绍。
我来说两句