00:00
好,那接下来呢,我们就看一下这个双流join,那在哪呢?我这边已经提前啊,打开好了这个弗林格01:12版本的一个文档啊好,那接下来呢,我们去找一下在这个地方data stream API啊,两个流对吧?Data stream API当中这边呢有一个operator。操作对吧,它有一个operators啊,操作当中呢,就有一个join啊,当然还有开窗对吧,Join process function,还有一个异步IOEIO这几个点都是非常重要的啊好,那这里边呢,现在window我们说过了,对吧,Process function大家也已经清楚了,那这两个。招引和这个eo将在我们当前这个需求当中都会用到啊,都会用到其他的一些比较经典的操作啊,招引我们点开。哎,这个网速。稍等一下啊,他可能有点慢,哎,不应该啊,我翻墙都开了谷歌。
01:02
我看一下啊。他好慢啊,我我。开了呀,对谷歌是可以用的,翻将开了,梯子打开了,好,那不管怎么样,我们这边打开了这个就不管了,我就刚刚测一下这个。梯子有没有开啊好,那接下来呢,这个是有两个两种状语,一种呢叫window状语啊,另外一种呢叫in join。啊,那肯定我们看名字就知道,这个在照应之前要先开窗,两个流要开窗,窗口内部进行照引对吧?而do join,那想必虽然我们不知道啊,这数量数量上的一个什么照,那其实它就不开窗,直接进行照影啊,那你想如果我们要用的话,当前这个需求订单和订单明细要用的话,用第一个还是用第二个呀。就上面是window状语,我也不让大家去敲window和对吧,比较麻烦,你敲一二,你觉得应该用哪一个。
02:19
对。那我们这边明显是不需要开窗的,对吧?啊用的第二种,但是呢,第一种既然我们聊到这个事情,也带着大家稍微的去看一下啊,那温度状元啊,那首先它这个写法你看啊。写法它的string join。装之后呢?Will条件对吧,Equals哎,也就是说这个流join引这个流的时候,然后呢,干什么事。Will,哎,这个是k select,这个里面也写的是k select,那第一个是它啊,就相当于will IDE对吧,我取一个ID,好这边equals第二张表的ID。
03:01
是这个意思对吧,好之后呢,开创。啊,要开窗进行join,然后呢,来里边写一个join方式对吧?好,那我们看一下分别有三种窗口啊第一个。滚动。To window滚动窗口。那这种噪音看起来。跟谁很像啊?首先看啊,是窗口内部状语,发现没。对吧,0100011011对吧,窗口内部照影吧,这个照影看起来跟我们曾经学过的Spark streaming,它直接做join是不是一个道理。对不对。Spark streaming的不就是这样子的吗?
04:05
对吧?啊,所以所以说fli如果说我们只开了一个滚动窗口去做计算的话,它跟Spark streaming一样了啊,VP处理窗口嘛,我们要收集完窗口的数据统一做计算,对吧?当然窗口你flink当中它有增量去合啊,这是另外一个说啊,那实际上呢,也就是说载一个批次输往下游输出一次,载一个批次往下游输出一次向P处里。对呀啊,像批处理啊,好,那大家看这张图能不能看出来它是绿流去照引沉流,还是沉流去照引绿流啊?这个点大家能不能看出来。啊,大家说一说。
05:11
下周上。成噪音率啊,没问题,看哪个就能看出来啊。看这个吧,看啊一般来说。左边join。右边左边装右边的时候,那最后转移出来的结果是不是也是左右这样放的对吧,左边数据右边数据好,那第一个看不出来,第一个无论谁撞进谁,结果都是00011011对吧,但第二个第三个就能看出来了啊那第二个你看啊,这是2333什么来着呢,二三。33。前面明显的陈留的数据,后面是绿流数据,所以它是陈留join引绿流啊,陈留照绿流,那这边呢,我们看出来叫orange three join green three。
06:03
对吧,哎,陈流去照应对流。沉留噪音的绿流啊好,第二个是滑动窗口,滑动窗口啊呃,滑动窗口噪音呢,那也就窗口内部呗,只不过说它有的数据会被输出两次,你比方说这个数据。由于窗口有关,有这个重叠部分,所以黎明被输出了两次,对吧?这就是我们滑动窗口的一个照影跟一样啊,那最后一个绘画窗口的招引,这里边有一个点需要大家去关注一下,什么点呢?绘画窗口,我们之前聊绘画窗口它就有一个特点叫时间不对齐。还记得吗?不像这个滚动窗口和这个滑动窗口,它时间是对齐的,因为无论是哪个K哪种K,对吧,时间一定是对齐的啊,大家同时开窗同时结束对吧?而对于绘画窗口呢,它特点是窗口不对齐,所以我们来看一下它里边有个特殊的点在哪呢?假如说我们设置了一个给。
07:11
对吧,间隔时间啊,那他要求两个流都这么久没有数据来。才行啊,两个流同时满足这个超时时间才可以。对吧,你某一个人不好意思,你会话窗口如果关闭了,由于时间不对齐,那我怎么跟他join呢?你这个没有数据,没有数据。对吧,这个能看懂吗?它是要求两个流同时。满足这个间隔时间,而不是某一个满足了就。关窗了。这块没问题吧。O不OK。对吧,应该能看得懂啊啊,因为他为了时间对齐才能够很好的去做join对吧,是这个意思啊好,那接下来我们就看这个join。
08:08
啊,它不需要开窗,不需要开窗啊,那我们直接还先看图啊,先看图,这个图呢,还是拿着谁啊陈流去照应我们的绿流,好,既然你不开窗对吧,所以它这边照应的就是一个什么范围。啊,我拿着这个点去照应范围。哎,我从你这个流的这个位置一直转移到这个位置。对吧,你这中间有满足为二的数据,那都要输出。对吧,啊,就这个意思,我在这个范围内去找啊,Interval对吧,所以这边我们能看到它有一个叫low boundbound。一个下界一个上界,好,那问一下大家啊,你看啊,我留弗它是不是来一条处理一条,那凭什么,那我这条数据二来的时候,它是不是这条流也应该来了,这条数据就这个点上的数据时间到这个点了吧,那它为什么能照应到这边啊。
09:15
以及它又是怎么照应到这边的?分别是怎么照应到的?这边有一个下界对吧,这边有一个上界。大家想一下这个是怎么做到的这个事情。What?嗯。施建时间。光有事件时间就够了吗?
10:02
规定时间戳的范围。啊,其实不太对啊,不太对,那规定时间的范围,你没听懂我的意思吗?我说这条数据这个流已经到这个数据了。已经处理到这儿了,这早都处理完了。早都处理完了。凭什么还能跟这条数据关联上呢?那是因为这个数据会写到状态里边吗?用到了状态编程。重要的是状态对不对,而且他保留多久啊,他保留low放的对不对,他是不是保留这么久啊。是不是它是为了保留这么久,好,那下一个问题你想啊。他为什么能跟这一条数据也能照移上呢?跟这个之间的数据为什么能照上呢?那你看我这条数据来的时候,上面一个流也才到这,后面数据还没来呢,它为什么也能装运到呢?是不是因为这一条数据会保留状态里边保留这么久啊。
11:08
对吧,保留up放这么久吧,假如说这个是十秒,这个是五秒啊,举个例子对吧,那也就是说对于绿流的数据来了,我要写到状态里面写十秒。而对于陈留数据,我要写的状态里边写五秒对不对?那你再回想一下Spark。Spark那个案例。18个水。不就是根据这种思想来做的吗?还记得我当时做的那个画的那个PPT吗?实时分析系统文档当中双流照影这两个PPT当时我做的啊,对吧,还记得这个吗?哎,我就直接看第二个了,对吧,缓存的这个。你看一下对吧,那。这个地方。
12:01
以及这个地方。Spark电和网吧没看懂。没看懂什么意思对吧,那这个不就是说把这个数据写出写到ready了,我采用的写到ready方案,那这个是第二个流,是不是写到ready。对吧,写到red这个方案,那其实在flink当中它就不需要red,那你看啊,我们之前给大家说了,什么叫状态,状态指的是历史数据。对吧,叫历史数据,好,那我在处理这个时候要用到这边的数据,那这个数据早就过了,是不是历史数据,对吧,所以要写数据啊写出去,那在Li里边呢,我们就可以写到状态里边来做这个事情。对吧,我们就可以写到状态当中来做这个事情。而Spark用的。
13:04
这老师举个例子。跟网吧有什么关系?好,这是我们所看到的。对吧?啊,我们所看的一个点啊,就是说他呢,呃,上下界来区分的,大家还记得那个Spark那个案例写的比较困难,对吧?啊,比较复杂啊好,那在这边呢,我们来看一下它,到时候你们可以看到它的代码呢,极其简单,一行代码就搞定了。双流run语一行代码就搞定了啊,Spark swimming那个案例呢,就超级复杂对吧,在弗林卡当中一行代码就搞定这个事情啊好,那这边呢,有一个点需要我们注意一下啊,第一个在这儿有一个注意,注意事项你肯定要看一下,如果说看到这个文档当中写的note,对吧,它这有一个注意啊,你一定要看一下这个目前他说这个in join。请支持什么?
14:00
仅支持我们的叫实践,实践。是不是对吧,仅支持事件时间,这个要注意一下啊。所以说我们要提取事件时间生成wordmark啊,一定要注意一下这个事情,好,那接下来呢,它的应用啊,下面代码也有啊,首先。陈留key by啊,一定要做key by对吧?啊,因为两个留呢,关联draw嘛,Drawing肯定要有on字段嘛,对吧?啊要有关联字段,所以keep这个就是我们的那个关联字段,跟上面那个一样啊呃,Select对吧,然后呢,Will跟上面那个窗口当中的well是一样的啊,然后in the draw in the draw呢,也要一个key stream。也要做这个green。绿流也要做K对吧?好,接下来between。比对呢,是指定上下界的。上下界的对吧,然后要用我们的你有一个process照应方式啊,然后呢,三个参数123,这个呢是陈流,这个是绿流,这个是输出。
15:07
啊,陈留绿流和输出对吧,好,但是这里面呢,其实官方文档还有一个小错误,什么错误呢?来看啊,它的参数行参名用的是left跟right,看见没。对吧,它的行参名用的它,但是底下用这个参数呢,它用的是first和second。这个都多少年了啊,我都见到这个都多少年了,他还不改。我看他也没有打算改的意思,对吧,这是明显的一个错误啊,明显的一个错误是不是left right con for second,但是他不改,我也不知道他为什么不改。那其实你想想看啊,你之前写的。发邮件,你之前写的Spark swimming,那么一长串的代码,在弗林当中就这么一行。啊,就这么一行,因为可以点点点嘛,对吧,就是一行代码就搞定了。
16:00
啊啊,当然了,你要说这边有一个分号对吧,这中间有一行两行代码。对吧,那如果说你之前写的是这个是out in full all the detail,那你可以写out.connect new一个。All the detail把这两个参数转进去,完了。就结束了。你以前写那么多。对吧,你想想看你Spark swimming里边写的那个。Join的代码你写了多少对吧,实际上在弗当中呢,就这么一点。把流准备好之后,就这么多两个流准备好对吧,然后一照完了结束了。啊,那这个时间是不是写的跟谁一样啊,是不是跟我们在当中保留的那个。过期时间,我们是不是在red里边写了一个过期时间啊,对吧,你要把这个数据保留多久,那在这边你要写多久嘛,对吧,假如100秒你就保留100秒啊,那其实写最大在公当中最大延值就够了,但是有一个点也要注意一下,前面这个参数啊,是负数,后面呢是正数。
17:05
不要不要搞错了啊,前面是负的,后面是正的啊,前面是负的后面正的啊,这样去照应的啊,OK吧,这个比较简单啊,所以呢,我们对着。官方文档一看啊,大家也都会了啊,等会儿呢,我们去做一个测试。
我来说两句