00:00
我们已经了解了flink CQ当中的常规连接查询啊,这种查询方式呢,其实就是原生CQ里边定义的作用啊,那呃,在这个过程当中,其实弗CQ是有一些限制的,就是我们说的啊,这里的连接条件on后面跟着的只能是一个等值的判断,所以我们会受到一些约束,那我们就想到了,那假如说啊,我们希望用到一些更加宽泛的条件,想判断它不相等啊,大于小于这个能不能去做呢?啊,在其他的一些连接查询的条件里边可以去这么去做,那是什么样的呢?哎,那是我们所说的flink所特有的流处理里边基于时间的连接查询方式啊,那之前我们学过啊,在data API里边双流draw语就全都是基于时间的双流连接嘛,啊,那就包含了窗口连接和间隔连接啊,那对应的这两种方式,当然也应该在弗link CQ里面有所体现。
01:00
目前呢,呃弗Li还不支持窗口连接啊,未来这个窗口表示函数TF应该也能够支持窗口连接操作,那现在已经实现的是间隔连接,间隔连接已经可以做到了,那整体上来看呢,所谓的间隔连接internal draw,它返回的也是一样啊,就是我们这里边呢,会有一个连接条件,然后呢,返回的就是符合连接条件的所有两张表里边所有对应数据的一个迪卡耳机,只不过呢,这里的连接条件,这个约束条件,那就比之前的这个等值判断就多了啊啊,刚才我们的这个约束条件呢,就可以有。普通的等值判断也可以有大于小于,另外还可以指定一个时间间隔,因为我们说internal,它的特点就是指定这个我们做连接的一个上下的时间窗口范围嘛,所以接下来我们看一下在具体的C口当中,到底怎么样去写这样的一个间隔连接。我们可以直接举一个间隔连接的例子啊啊,那现在呢,我们就不要使用订单表和商品表了,因为他俩做这个时间间隔的连接好像没有什么道理啊呃,因为订单表下订单肯定是有时间的,我们另外呢,再来定义一个发货表shipment啊,那发货表指的就是主要是我们当前的这个平台或者是卖方,那收到订单之后,在一定时间范围内应该要把货发出去,比方说我们的要求就是收到订单之后四个小时之内就要发货,诶那所以如果说我们想要筛选这个匹配的数据的话,那就可以用一个间隔连接查询啊,就是让这个订单表和发货表做一个interval draw,哎,那我们会想到标准CQ语法里面并没有interval drawing这样的写法呀,哎,那我们如果要直接写成inner drawing,或者说这个al drawing这个就不对了呀,我们注意啊,在写这个间隔连接查询的时候,并不需要使用draw关键字,而是。
03:00
在这里直接用逗号分隔两个表,直接把它跟在这个from后边就可以了啊,其实这种方式我们也非常熟悉啊,在这个标准CQ里边这种写法,这就相当于是一个交叉连接,就是一个所谓的cross啊,本质上其实就是两张表里边所有的数据拿出来啊,错一个笛卡耳机啊,所以我们直接就用这种方式把两张表连接在一起,后边呢,哎,可以跟上where这样一个连接条件,因为假如说啊做两张表的交叉连接的话,那很显然也得指定对应的这个P要相等啊,啊,这是一个基本的连接条件,一般这个时间范围符合的这个时间间隔呢,那应该是一个额外的条件,所以说如果说我们还有这个ID要相等的这个标准的话,那可以跟在VR后面啊,注意这个交叉连接后面就不是on了啊啊,只有draw之后,后面条件是用on来表示的交叉连接,这里是will,其实这个效果跟前面我们所做的这个内连接,然后on这个条件是。
04:00
完全一样了,然后后边呢,哎,就可以and where and,再追加一个连接条件,这个条件那就是指定当前的某一个时间字段,比方说诶,在这个O这张表啊,就当前这个order这张表里边,它有一个order time下订单的时间,诶那么我可以指定它between在什么时间范围内啊,所以后面这个定义方式我们就非常熟悉了啊,这就跟之前我们做那个开窗函数定义的那个时间范围一样啊,Between什么and什么啊,那这里我们比方说是四小时之内发货,那它的上界啊,时间最早就能够达到什么呢?哎,就能够达到这个发货时间减四个小时,也就是说这个订单啊,订单可以最早是在发货时间的四个小时之前。然后end当前的发货时间,也就是shipment这张表里边的ship time啊,那这样的话,这就是呃,从发货时间往前追溯四个小时,这个时间范围内的订单时间,它是有效的,就可以匹配在一起。
05:05
当然了,后边跟着的这个时间间隔的表述啊,这是最标准的一个between吧,时间间隔那除了这种表述之外呢,也可以直接使用啊,就是我们比较熟悉的这种不等式的表达啊,就是大于等于某一个时间and啊,小于某一个时间这个都是可以的啊,遇到的时间间隔就都用这个interval,然后比方说10MINUTE,这就是十分钟,用这个来表示就可以了。另外也可以直接给一个等值连接,这都是完全可以的。这就是关于flink cql当中间隔连接查询的用法,哎,那需要注意的是,目前间隔连接查询的只支持具有时间属性的颈追加表啊,就首先这里边我们必须得有时间属性啊,要不然的话你怎么判断它这个时间范围呢?然后另外只能是仅追加表,也就是说这个动态表里面的数据啊,你想要对它做这个间隔连接,然后进行查询,我们这里边表里边的数据只能是追加上去,不能做更新。
06:05
我们自然能够想到啊,假如说这张表里的数据有更新的话,那之前我们匹配起来的那些笛卡尔机那些数据,那就都要做更改啊,这个太过于复杂了,所以目前我们只支持颈椎加表的间隔连接。那假如说有更新的表又应该怎么办呢?啊,那除了这个间隔连接之外,CQ其实还支持另外一种非常复杂的连接操作,它直接就叫做时间连接,跟时间相关的draw操作,Templeal draw啊那这个是主要针对所谓的版本表而言的,什么叫版本表呢?啊,简单来讲就是我们的这个动态表啊,随着时间变化的话,我们就只保存当前最新的这个进展,当前变成什么样了,我就把这张表,哎,读出来的就是什么样子,版本表呢?就是随着时间变化的这个过程,中间的任何一个版本都会记录下来,所以我们可以把这个版本表理解成一个更新日志啊,就跟我们所说的更新日志是一样的,所以呢,它就是具有时间属性,而且还会随着时间不停的去做更新操作的这样一个动态表。
07:14
那如果说我们要去连接一个版本表的时候呢,那就不是只把目前我们这个快照直接连接在一起了,而是还需要去根据数据发生的时间,找到当时那个时间对应的版本来做一个连接合并操作,哎,那所以这样的连接呢,就叫做时间连接temper join。那这一部分内容呢,涉及到了版本表定义啊,这个操作会比较复杂一点,我们这里就不再详细展开了。这就是关于廉洁查询所有的内容。
我来说两句