00:00
我们已经了解了link CL当中的聚合查询,这其实我们在应用的过程当中啊,非常重要的一部分内容,这就包括了分组聚合,窗口聚合,开窗聚合,以及啊在实际应用过程当中啊,现在是比较复杂特殊实现的一种top n聚合啊,那这个需求其实实际应用当中非常的常见。接下来呢,我们再来介绍另外一种,应该说是对于表的处理啊,在CQ当中非常重要的操作,那就是连接查询,哎,我们知道在CQ里边啊,这个join这样一个操作其实非常重要的,因为一般情况关系型表的设计啊,我们是要求他要所谓的啊满足第三范式的3NF啊,什么意思呢?就是说我们一张表里边所有的列,它都应该是依赖于我们当前的主见primary kid啊,比如说啊,我们定义一个商品的订单表。当前这个订单表里边的,诶,我们就应该是来了一个订单,呃,一个order,它会有一个订单的编号,一个订单的ID,那么这个订单里边呢,诶,我们应该就记录了到底是购买了哪个商品,可能有一个product ID,那对应的这个商品的详细信息,我们有必要补充在这个订单表里边吗?当然没有必要啊,因为这个首先这个信息非常的冗余啊,而且你每来一个订单,不同的订单有可能买的都是同一个对应的商品啊,哎,那对应的这个信息你就要完整的复制一份,如果发生更改的话,还要全部都查到,全部重新更改,这当然是很麻烦的,所以一般我们设计的时候就是这边只来一个对应的ID,唯一的这个主件放在这儿,而至于这个详情呢,哎,当然,商品的详情应该有另外的一张表。
01:47
我们把每一个商品的ID作为主件放在这儿啊,那对应的详细描述信息就放在了其他的列里面,所以我们看到啊,对于这样的一个表的设计原则,它的特点就是方便表的更新管理,但是呢,如果说我们想一次性的查出足够多的信息就有点麻烦,那得怎么样,就得把这两张表按照这个键要。
02:11
做一个draw,做一个连接啊,那在CQ里边,其实这个操作非常的频繁啊,我们也非常的熟悉了,对于流处理而言,Flink CQ它也同样支持这样操作,那我们想到啊,针对这个两张动态表的连接join,其实本质上这不就相当于是两个输入流的connect吗?啊,所以我们会想到所谓的join。Flink c里面的状语就跟我们之前在data stream API里面讲过的connect是非常的类似。而之前我们在讲到data three API的时候呢,除了非常普通的这样的一个connect操作,两条流进行合流操作之外,还有一些呃,专门基于时间的连接操作,哎,那当时我们讲到的那个draw影啊,两条流的draw影其实都是基于时间的,要不就是窗口draw影,无音draw,要不就是间隔连接啊,In t draw,那所以对于link CQ而言,这些内容当然是都要去支持的,所以呢,整体来讲啊,在用CQ当中的连接查询join可以分成两大类,一大类它就对应着标准CQ里边的两个表的join,另外一大类呢,那就对应着之前我们讲过的data streamam API里面的啊。
03:30
跟时间相关的那些连接查询那一部分,那是流处理里边所特有的。首先我们还是先来看一下啊,就是CQ原生的这些常规的状语操作,所谓的这个连接查询,这个基本语法其实我们非常熟悉了啊,它的关键字就是join啊,就是我们查询的时候,那就是select的某些字段,然后from from哪里呢?两张表,某一张表去join另外一张表。那一般按照这个习惯,前面的后draw影,后面的完了我们就分成了左侧和右侧啊,所以我们一般如果画出来的话,就会认为是左侧表去join一个右侧表,然后后边呢,一般都要指定一个连接的K,要指定一个关键字啊,指明当前的连接条件,那这个呢,使用的是2ON,后面跟着的就是定义的连接条件啊,一般情况我们都是比方说啊,ID要相等对吧,所以我们可以看到之前说过这个订单表和商品表,比方说这个订单表叫做order,商品表叫做product,这两张表要做一个连接查询,哎,那CQ怎么写呢?非常简单啊,就是select芯啊,查询到的所有的这个字段都提取出来,From order,然后我们可以去做一个内连接啊,那那内连接我们知道就是inner Joy inner Joy product,然后on后边是当前的筛选条件啊,连接条件当然就是ID要相等啊,啊就是order这张表里。
04:58
的product ID要等于product表里面的ID这个主件啊,这就是一个最简单的查询方式啊,我们需要注意的是目前flink CQ当中啊,只支持等值作为连接条件,也就是说这里的on这个条件啊,后边只能是相等的判断,不能有其他的判断啊,那所以这里边我们这个对应的这个条件啊,就只能是指定某一个K,然后要求它相等作为连接条件,筛选出对应的字段啊,那所以它返回的呢,就是所有符合连接条件的所有行的一个组合,这是inner drop,我们平常用的最多的应该就是内连接啊,Inner draw,那当然了,除了inner draw之外,CQ里边还有外连接啊,就是有所谓的左外连接,右外连接,还有全外连接,它的区别就在于呢,哎,我们说这个按照连接条件连接两张表,那就有可能出现这个不匹配的一行数据啊。
05:58
就是出现这个落单的数据没有匹配行,那这一行数据是不是就都扔掉了呢?如果要是根照影的话,那确实就都扔掉了啊,就是只有满足连接条件的那些数据。
06:10
对应的啊,我们把它筛选出来,做一个笛卡耳机的组合,那现在呢?啊,现在如果要是外连接的话,就可以保留落单没有匹配的这些数据啊,这就有点像我们之前所说的啊,在connect这个操作里边,如果说我们用一个状态编程,用一个直状态来保存已有的数据的话,那不论它匹配上没有,我们都可以做一个处理,那这里外连接就包含了左外连接啊,那就是左表里面的落单数据都可以单独的做一个输出啊,那还有就是右外连接,右表里边。落单的数据可以做一个单独输出,另外还有就是全外连接啊,全外连接当然就是所有的落单数据也都可以完整的输出数据啊,这个概念都非常的简单,跟标准CQ里面的用法是完全一样的,而在Li CQ里呢,所支持的连接条件外,连接也是只有等值条件,所以说只有相等的判断才能出现在这个啊条件后面。
07:08
所以我们看到,假如说啊,我们想要看到当前这个订单表里边,呃,我我们这个可能有一些商品下了订单,那会出现在订单表里面,它就未必能包含所有的商品ID,哎,那所以如果说没有出现在订单表中的商品ID,我们也希望把它都查询出来啊,对应的信息都展示出来,这个时候怎么办呢?哎,这个时候就可以用一个右外连接,因为我们是订单表order表去连接product表吧,所以这个时候right join product啊,那这样的话,连接出来的product这张表里的所有信息就都会展示出来。这部分其实非常的简单,跟标准CQ里面的知识是完全一样的。
我来说两句