00:00
来我们来讲一下弗link里边我我们之前data three API没有提到的一个API,那就是所谓的重啊,那之前之所以不提到,其实就是因为join云它的这个使用受限制比较大啊,大家来看一看到底是怎么受限制呢?我们看一看这个官网上的介绍啊,Fli里边的drawing到底怎么用?大家看到flink里边的drawing呢,主要分成了两大类,一个叫做window draw,另外一个叫做interval join,呃,字面来理解的话,呃理解的话一个就就是窗口的连接,另外一个就是这个interval是时间间隔对吧?呃,就是间隔连接,那分别指代什么含义呢?首先我们来看这个窗口连接啊,窗口连接比较简单,它简单的一个用法是怎么用呢?就是直接基于一个data stream去点join,然后去join另外一个data stream,对吧?啊,为什么这个就叫做窗。
01:00
口照应呢,那就是因为之后他能做的操作就是这个流程就固定死了,没有别的操作,就是接下来你必须怎么样呢?照应之后怎么样做操作呢?接下来where where,大家看这里边给的是一个什么key select,也就是你要指定当前的K是什么对吧?既然是做状语嘛,大大家想到了前面我们connect是不是也应该要指定一个K啊啊,对吧?啊,你按照这个不同的K分到一组,这样连接起来才更高效嘛,那我们在做状语的时候,你当然也是得指定一个连接条件对吧?呃,连接这个到底K是什么?所以大家看到这里边就是where一个K,这这个K的选择器应该指谁呢?当然就是外边调用撞用方法的这个date stream,它的K是什么,对吧?然后怎么样e to又一个K的选选择器,那这个K是不是就得是连接的这个参作为参数的这个data stream里边的一个K的选择器,对吧?然后接下来注意啊,这个连接还没连接完。
02:00
接下来必须继续点window要开窗,所以这就是为什么这种join方式叫做window join啊,所以就是它必须开窗,然后后面呢,只能调一个方法叫apply好啊,所以这里边这个apply里边传了一个什么东西呢?开窗当然就是大家看到是一个window sign对吧?啊,那就是你可以是滚动窗口,滑动窗口,呃,绘画窗口,各种窗口去定义,那后边呢,做当然这就是一个窗口函数了,这里边只能传一个drawing function啊,所以大家看到他能做的操作就比较的局限,对吧?呃,能够处理的这个内容也是比较有限度的,我们再结合这个源码里边来给大家看一下,在这个data stream API里边,大家看到有一个join语方法,对吧?而且我们如果要是搜的话,Data stream API里边只有这么一个状语方法,它的也没有这个参参数重载,对吧,只能传一个data stream进来,大家看到这两个data stream的类型可以不一样,对吧。
03:00
啊,因为本身我们当前data stream这个类型叫T嘛,然后连接的这个data stream类型是TR,得到的数据类型是一个drawing the streams,就有点像connected streams,然后里边的数据类型TT222条流的数据类型都在里边了,然后接下来我们看这个draw the streams又可以调什么API呢?哎,这里边大家就这么看,就看的非常明显啊,我们来把它调出来是不是?接下来你看除了clean和this,大家知道clean是这个清除对吧,清空的一些操作啊,This的话,我们主要是做这个当前这个自己的这个引用啊,那这里边主要能调的API就是一个where啊,那这里边的这个where返回的是一个什么类型呢?就是一个where类型,然后这个VR类型,接下来大家看,就是我自己里边定义的一个,就是内部的一个类型,对吧,呃,内部的一个这个内部类啊,然后这个VR类型。
04:00
又只有一个方法,就是e two,而且大家注意一下where这里边K的这个选择器是什么呢?是T1类型去选择一个K,那这里边的T1类型又是什么呢?大家看前面我们里边传的是那个TT2对吧?这里边其实定义的就叫做T1T2。所以就是第一条流里的类型叫T1,第二条流里边的类型叫T2,然后接下来呢,第一个位二是不是就是第一条流里边去做键的选择啊啊,那然后接下来后边呢,Where只能equal to嘛,Equal to大家看到是T2,然后去选择一个K对吧?哎,就是再去跟什么去连接呢?第二条流里边的K选择起来它呃,就是选择出来,然后它俩如果相等的K的话,哎,这两个数据连接在一起去做操作对吧?然后接下来得到的是一个equal to类型,Equal to类型呢,又是一个下面内部类型对吧?那这个equal to下面只能调一个window方法。
05:04
那这个window方法大家看这个window sign,这是大家熟悉的对吧?啊,传一个这个window的分配器进去,得到的是一个叫做with window的一个类型,这个with window呢,哎,里边方法很多,但是大家看一下这都是窗口那个可选的一些操作,对吧?Trigger,呃,触发器avior移除器对吧?Lo lateness,它还可以允许这个处理这个迟到数据,对吧?如果要是迟到的话,你开启这个,然后大家看其他的方法是不是都是一个apply啊啊,所以我们就说这里边它其实只有一个apply的这个窗口处理的方法,然后对于这个apply而言呢,它可以有几种重载的方法,简单来讲就是你可以传一个函数,这个函数是什么?就是一个T1,一个T2,大家想连接在一起了嘛,啊,那两个数据是不是我都能拿到,然后这两个数据,然后到底要做一个什么样的转换调整计算,最后输出一个一个另外的一个数据类型输出就完事了,对吧,得到的。
06:05
就是一个data stream o output,所以就就这么简单的一个转换,那当然这里边还可以有一个什么呢?T1T2,大家看还有一个collector collect collector用来干什么呢?哎,这个大家可能看的不太清楚,它其实对应是什么?上面这个是匿名函数的这种写法,其实就对应下面我们的这个,呃,对应的这个函数类的写法对吧?上面简单的那个就是draw function,当前的draw function里边怎么实现呢?啊,实现一个draw方法对吧?呃,1FIRST input 2second,最后输出一个outlet对吧?你两条数据不是连接吗?连接起来了,转换输出就完事了,然后如果要是说上面第二种方法是什么呢?Fla draw function对吧?为什么有一个collector呢?大家想那个flat map输出的时候不是用了一个collector去输出的吗?这里边就是还有一个方法叫Fla装晕function式,它里边实现的这个装晕方法,大家看到就多了一个collector对吧?这个al啊,我们输出的时候就。
07:05
就不要直接返回那个al类型了,而是可以输出多条数据,每一次呢都调用这个alt.collect输出就完事了,跟我们之前讲的map和flat map的区别是一模一样,这就是这个关于drawing啊,Window drawing在这个呃,调用过程当中到底是怎么样去用的这个过程大家会发现这个尽管讲这个源码的时候,数据类型好像又多了很多,但实际应用非常简单,大家看就没别的操作,对吧?你这里边就是按照这个流程,一个data streamam,然后join,然后where,然后equal to,然后window,然后apply就完了,就是这个过程啊,所以它应用的场景相对会局限一点,然后这里边如果具体来区分的话,那就根据你传进来的这个窗口不一样,它的这个照应方式也不太一样,对吧?啊,那其实主要就是窗口里面的数据不一样嘛,呃,首先大家比较熟悉的滚动窗口去做照应,怎么照应呢?呃,具体代码来实现的话,大家看到这里边我们实现的这个代码啊。
08:05
就是首先大家先看一下这个这个图吧,这里边就是直接开启滚动窗口对吧,头连尾,尾连头,然后把当前的两条流直接就全框在一起了,现在不是分组的那个啊,KPI之后的那个状态,各自处理各自,而是要直接把这两条流一条绿流一条成流要连接在一起,那现在这个怎么连接呢?连接得到结果是什么呢?诶大家注意啊,这个开窗之后啊,WHERE1扣to,然后开窗之后连接得到的结果,大家看这里边绿流里边这相当于是什么?呃,如果我们把这个里边的这个数字就当成当前的那个时间戳的话,这我们把它当成一个毫秒数,对吧?这就是零到两毫秒一个滚动窗口,那零一是不是就都属于零到二秒的这个窗口,第一个窗口对吧?然后二三就都属于第二个窗口,二到四秒的毫毫秒的这个窗口,那大家看这个绿流和城流里面的零一在这个流里面做。
09:05
的连接得到结果是什么呢?其实就是直接做了一个做了一个笛卡尔基对吧?来大家看是不是就是这样在当前窗口内做一个笛卡耳机,呃,首先前提是这个它的ID那个当前我们的那个K都一样对吧?呃,已经是前面做过那个,呃,VR,然后EQ two嘛,他们首先这这两个我们提取的那个K,它俩都是相等的这些数据啊,然后这里边有这个零一条数据,有一一条数据下面也是,然后这个窗口内合并起来,连接起来得到的结果呢,就是00011011对吧,直接笛卡耳机两两配对得到这个结果啊,那接下来如果要要计算怎么计算,这不就是大家看到这个源码里边你那个装function的那个处理吗?大家看到这个join function里边不就是有一个first,有一个second吗?这不就是刚才我们拿到的这两个数吗?对吧?呃,就是这个001。
10:05
这不就是FIRST3吗?最后你把它包装起来输出就完事了。好,呃,那大家可以思考一下,当前这幅图里边到底是谁照应谁?谁状给谁的话,大家会想到得看什么呀,是不是就是得看后面我们做处理的时候,谁是一谁是二对吧?哎,就是视一的那个数据,不管是类型还是后面我们这里边的这个first和second的它的这个类型对吧?这都表示当前它应该是就是外边我们调运撞运方法的那条流,而后边的这个第二个啊,这都是里边被撞运的那条流,那大家看一下当前这个数据应该属于什么呢?啊,前面这个零一这个看不出来,应该都一样嘛,后面这个就看出来了,大家看这个得到的是2333对吧?诶,那所以得到的这应该是什么呢?哦,大家看这个后面代码也非常的明显,这是城流去绿流对吧?诶是下面的去join上面的,所以下面的数数据,我们得到的那一对一对的数据是它是first对吧,它在前面好,所以其实就是把它做一个笛卡耳机,然后我们得到。
11:17
结果做什么转换呢?比方说这个你看我直接就把得到这两个数据直接用逗号分割拼在一起,直接输出了,所以大家看这其实并不是什么特殊的这个数据啊,这就是当前我们这个这这段代码代码输出的结果对吧?啊,这段代码就是到这个两毫秒这个窗口啊,连接结束的时候,然后输出什么,输出哪些数据呢?输出的就是零逗号零零逗号一,一逗号零一逗号一对吧,这就是当前这个窗口连接之后输出的结果,大家如果想要做更复杂的操作的话,比方说我们大家想到这两条流,一条流是这个,呃,这个order pay对吧,一条流是这个呃,一个receipt,那我们连接起来的就应该是应该是一个对应的那个order pay,一个对应的receipt,把它们拼到一起,我们输出了那个匹配的那个结果,对不对啊,所以这这其实都是大家能够想到的这个状态,那同样还有这个滑动窗口对吧,滑动窗口那。
12:17
同样的就是窗口往后滑嘛,里边还是收到当前这个窗口内的所有的两条流的数据,做笛卡耳机对吧?啊,还是做这样的一个两两配对的计算,那后面还有这个30WINDOW 30window也是一样,有一个GAP对吧?啊,就是超过这个GAP距离的,我们就分成不同的窗口,在同一个窗口内的数据呢,两两配对做笛卡耳机啊,所以它的核心就是收在同一个窗口内的数据,两两配对做一个笛卡耳机,然后收集起来的这一对儿数据,最后输出一个结果就完事了,这就是所谓的这个window drawing的过程。
我来说两句