00:00
对吧,好,接下来呢,咱们还有一个叫。这个状你看这个图。它也是陈留在庄园绿流,然后呢,人家这个就很有意思。哎,我这条数据来了。对吧,就感觉好像是拿着一个点,这一个点的数据去照引人家的什么一条线。我照应的范围是这么大。但这个感觉好像很好诶。是不是能感觉到吗?对吧?好,那我有个问题问大家。你看。我这条数据到二的时候,那按正常来说,你这个流对吧,我这个流接收到二,那上面这个绿流是不是也是这个位置,我俩时间肯定是统一的,对吧,我俩时间轴肯定是同时往前走的。对吧,同时往前走的。那有什么问题问大家呢,是这样。这个二来了,它为什么能跟这个零这个数据能关联上呢。
01:14
嗯。他为什么可以跟这个零。关联上吧。啊,他你看啊我。来一条处理一条。陈流来了二,那绿流应该就是处理到这个位置的数据,对吧,处理到这个位置。那我这个二凭什么能跟这么多的数据关联上呢?对吧?还有一个更关键的问题在于,这个倒还好,对吧?那我只要把绿流存到状态里边,就像云总所说,状态对了没问题,我们那人说了用状态对吧?好,它存到状态里边,我确实可以保存下来,就跟red的作用一样,对吧?我们在Spark里边是不是用的red,是不是跟作用一样?
02:13
对吧,好,那关键的问题在于这个怎么解释啊。我怎么跟未来的数据还关联上了呢?对吧,你这个来了,你要去关联它,那没问题,你这个数据呢,存在状态里边,你就状态找对吧,我状态那存这么久,假如说呢,这个是五秒啊,我状态那存五秒。对吧,我给替你保存五秒,关键的问题,他凭什么跟后面能关联上啊。乱序,不对。这跟乱序有什么关系啊?想一想。我的妈,不对不对不对。不对。我的问题是什么,你这个数据来的时候,它这个流也才到这儿。
03:06
这个是时间,这是未来呀。这个是未来。他凭什么能跟未来关联上了?延迟,那延迟也不能延到未来呀。他凭什么照应范围是这么大呀,对吧,我的意思是说,你顶多照应这个范围呗。你凭什么还能到未来去啊?你,你还能把这条数据关联上啊?为什么?这半段怎么解释啊?这个半段怎么解释啊。允许迟到的数据。不对。这,这想不明白吗?
04:01
你你直接怎么写的,很简单啊,不是。跟那个都没关系。陈留时间停住,等绿流来啊,时间你还能把陈留停住啊?啊。大家就想不通这个道理啊,来看。一分割。左边。右边。陈也在状态。对了,终于有同学说到点子了。啊。辰也在状态,绿找辰,对了啊,这会儿才真的对了。对吧,你看这半段假如说是五秒,这是三秒,我举个例子啊,那它呢,是预留状态存五秒,而这部分数据为什么能关联上呢?因为陈留会被放在状态里边。啊,两边都会被放在状态里边,这样才能保证。
05:03
无论谁先到,最终都能关联上,对吧,你看我画一条线这个数据。啊,本应该他俩可能同时到那是最好的,对吧,但是没有同时到那陈留来晚了,来晚了怎么样,氯硫等于等。对吧,好,那这半段呢,是不是相当于绿流来晚了,绿流来晚了怎么办呢?陈留等于等。对吧,不就跟我们用Spark streaming处理,就是用red处理Spark stream那个道理是一样的吗?对吧,只不过说在Li里边,它用的状态来做存储的。人家用的是状态,从到状态里边,所以这边呢,它要给你两个时间啊,一个叫lower bound,一个叫up,就是上下边界在这。给定这个时间啊,我们在这儿来看啊,这。他join的内容就在这儿。
06:03
对吧,啊,那绿流的。数据能关联上的哪些数据呢?陈留加lower棒,哎,那也就是说这个lower棒得得是个什么?得是一个负数对吧,往前找嘛,得是一个负数啊,然后呢,小于等于这个范围,所以它转引的是一个什么呢?是一个范围啊,那这个分别代表的绿流存储时间跟陈留存储时间,就状态存多久。对吧,他状态也会。过期。也会过期。啊,它不能永久存了,因为我呢只转移这个范围对吧?好,假如说我时间已经到这儿了,那我转移的应该就这个范围,对吧,你看它这个灰色部分,那这一部分数据还有用吗?没有用了,他也得把它干干干什么给它删掉。对吧,这照应范围好,那我们来看这个代码怎么写的,很简单哈。我们刚才说了一行代码搞定吧,来看是不是一行代码啊,就是orange three。
07:00
陈留。点TBY,好,那这个T呢,是为了on字段做准备的,那你两个人join,你总要有一个什么相等的条件,对吧,好用的是二,然后呢,叫。Into状语。Greenri。点T。对吧,K,好,那一样的,呃,那我呢是一个监控流照引另外一个监控流,两个监控流呗,那拿着键去比较对吧?好,那between范围,给定时间范围,哎,那前面是复数,看见没。前面给的是lower bound,后面给的up bound是这个是负二,负一,哎,就表示这个,哎,那你呢,负二。这个呢是一啊,这个呢是两毫秒,这个一毫秒存在状态时间对吧,也就限定了我们那个join的范围,看能不能关联上啊,当然这个状态会过期,这个呢我们到时候可以证明啊。呃,那最后呢,调用process,你有一个process function,这里面呢,有两个参数,Left right左边的数据,右文的数据对吧,然后合并写出去,当然这个文档呢,它有bug啊。
08:15
看到了。当然不影响我们去阅读这个文档啊,但确实他写错了。对吧。行参。Left right调用的时候用的是first second啊。一直没改。啊,我不知道15有没有改,我来看一下15文档的,我还没翻过呢。15、不知道有没有改,从有抓操作开始。他这个东西呢,就一直是这样。啊,他一直是这样。我估计啊,他这个文档的数据没改,我估计他也没改。哎,改了15,终于改了。还没改啊。
09:00
14还没改,我给你看啊。我当时好像翻过14,我看一下14,我我记得好像14没改。就是你再往前翻十二十一十,它这个状语里边呢,它都是那个地方写的有问题啊。15终于改了,我看14改没改。你看14还没改呢。Left right for the second对吧?啊,每次讲到这块的时候都要吐槽一下,终于终于在这个15版本他改了。Left the right left the right看见没,对吧,他终于改了啊,14都没改,13呢,但但是不影响我们阅读对吧?好这个点啊,那接下来还有一个事情,我们要注意一下,什么事呢?在我们用inter draw的时候,这玩意啊。这句话一定要注意一下,他说这个join呢,Currently,当前呢,仅支持实践时间。注意啊,处理时间不行啊,它不支持这个处理时间,仅支持失件时间,而且我要告诉你的是,那照呢,它是一个内连接。
10:06
它是一个内链接。他做不到外连接。如果说你要做这个左外右外,或者说做这个全外。做这种操作,你你要自己写代码,用那个什么呢?用connect。加状态变成自己写。用connect算子加状态编程,自己写。啊,就很麻烦。OK吧,啊就很麻烦,但是呢,弗link s里边它的内连接。左外。右外。都有。啊。它全都有右外啊,加全外这些东西呢,全都有。那这就很舒服了。对吧,啊,到时候我们会聊flink啊,那这个呢,嗯,Flink circle,那这边呢,我们等会儿呢,也会去给大家去测一下,哎,我们这个in draw。
11:01
啊,他到底是怎么玩的,对吧,包括我们所说的这个状态过期,因为从官方文档来看,它只是告诉我们了这个数据join的一个什么。范围对吧,他只是告诉我们数据照应一个范围,并没有去说呃数据过期的一个事情对吧,但实际上我要告诉你它的数据呢,确实是会过期的,就是状态里边数据啊,好到时候我们来看到啊,像这个呢,我们就截掉,这是我们关于indo招的一个。说明可以吧。好,那接下来呢,咱们就写这个关于硫的。Draw。可以吧,啊,写这个留的join啊,就是data stream的join啊,那咱们呢,我把这个复制一份啊,我把这个复制一份。因为呢,我可以拿这个改一改嘛。对吧,这是我还是放在这个测试包里边,因为它不属于我们正常的吧,对吧,这个呢叫。零四啊。银色data string。
12:02
Join test。好,那咱们呢,嗯。我想一下这个地方来一个8888端口啊嗯,我们先用一个变异路啊,先用一个病异路啊,其实join呢,跟多个病毒没关系,因为我们肯定要做KPI嘛,大家还记得对吧。提取时间戳,然后呢。做这个事儿啊嗯。咱们这样。咱们就。一步到位。对吧,直接把这个干掉。可以吧,啊,我干什么事呢?嗯,读取数据。对吧,第一个,然后呢,转换成一个流啊,甚至呢,我把这个东西都干掉。不要那么多乱七八糟的东西。
13:04
这个拿过来。把这个换掉。对吧,我直接。这样写。就是从端口读数据,然后呢,呃,转化为我们的。数据流。OK吧啊,咱们做这个事情啊嗯,那接下来呢,咱们再搞一个啊,我把这个再复制一份,我再来一份啊,下面东西就不要了,这个就不要了。这个先不要对吧,这是第一个流八八端口对吧,我再来一个第二个流叫9999端口啊,然后呢,这个叫二第二个,这是第一个。可以吧,这是第一个流,这是第二个流啊,咱们呢,搞两个流啊,搞两个流啊,那这就够了,对吧,而且呢,两个流已经转化为这个。招聘对象了啊,当然了,你想换一个招聘对象也可以。
14:02
啊也可以,这个倒还好吧,或者说咱们这样,嗯。咱们在这边啊,我再来一个。我把这个复制一份,CTRLCCTRLV啊复制一份叫我三二。中间呢,我就不要这个。VC了。啊,我不要维C了,对吧?呃,搞一个什么呢。一个ID一个name吧,对吧,我搞一个类型的一个name。可以吧,那我们就用两个啊,那我把这个改一下,把第二个改一下,改成我32啊。好,那这里面呢,要改的东西挺多的。Water s2这边呢,返回water s2。嗯,这个第二个位置就不是一个double了,对吧,直接。四的一就好了,嗯,这块我做了一些调整,大家看一下OK吗?OK的话给我扣个一好吧。就觉得可以接受的。然后给我扣个一。
15:00
行吧。这个应该我觉得没啥问题吧。对吧,首先呢,我把代码合并了对吧,然后呢复制,然后呢,一个八八端口,一个9999端口,我们从两个端口读数据嘛,对吧,然后呢,把这个招聘改了一下啊,一个water sensor,一个water s2,因为这样的话我们好写这个draw对吧?啊那第1WATER sensor呢是正常的。这个idvc加TS。我32呢,中间我改了改成一个name可以吧,啊就这样东西好,那接下来呢,我们写join。什么join对吧,当然我们看到join呢,是要两个监控流做join引啊,那就是我的sens一点。K。我sensor.get ID对吧,点inter draw啊然后呢是我sensor ds2点。K啊,那我32的ID对吧,这是我们的。
16:00
关联的键。On后面相当于搜个里边on后面的字段对吧?点,然后呢,给一个between啊,但是这个时候除了掉between之外,还有in time in processing time,诶那也就是说这边不是看到in processing time吗?我告诉你他没用。对吧,你看官方文档,它是不是告诉我们目前只支持什么实践时间,这目前那con什么意思呢?那未来有没有可能支持这个。处理时间呢,有可能对吧,我们看啊。啊,15还不行,15还是有这句话,但是呢,他相当于提前把这个API怎么样做好了,在这儿,但是呢,这个功能还没有实现,所以呢,他官方文档特别的做了一个说明。对吧,告诉你当前只支持这个实践时间啊,那我们就写这个between啊,然后一个上下界啊,下界呢。time.second假如说呢,我们给一个负五对吧?好,那上届点second给一个五,两个呢都存这个五秒钟啊,那注意啊,这个呢,你要想专业的范围是这样,你这一定要写负的。
17:09
一定要写负的啊,比它小对吧?因为它这个东西告诉我们转运范围是什么,是陈留去加上这个值对吧?那如果你这个下边界给的是一个正值对吧,是个正数,那你一加他不就这个嘛,比你大吗?不就到你后面去了对吧?那如果你给负数,它加不就到前面去了,它能跟前面关联上吗?对吧?啊,这个告诉你啊,直接这样算的,所以第一个位置呢,一般来说我们都给赋值啊,好,然后之后呢,按照我们所说的,它应该调用process,但除了process还有两个东西,一个叫lower boundund exclusive,还有upbound exclusive啊这是什么意思呢?就是把这个排除掉。本来默认的啊,假如说你是负五。五对吧?啊,当然是拿这个值去减这个五加这个五的一个范围对吧?X啊,这个我们就不写了,它默认呢是左臂右臂。
18:01
那你可以把它变成开区间,也可以变成左开右闭,当然也可能是左闭右开,对吧,就看你有没有添加这个东西叫exclusive,叫排除嘛,就是上下边界,你可以给它排除掉,那一般来说呢,这个点的数据我们就不管了,对吧?不不排除直接process啊呃,咱们呢,有一个这个process join function。我的三,我的32,那输出数据呢,产品就简单一点啊,我也不写另外一个变量了,我直接写一个TOP2。它二里面放什么呢?放WHAT3跟WHAT32对吧,直接写一个TOP2出去啊好,那这边呢,有一个left,有一个right对吧,那我们就直接out.contact有一个table to,然后left right。给它放进去。对吧,这是我们的一个装运之后的一个结果啊,那我们的团号加倍得到一个。结果对吧,好,Print。做一个打印。
19:02
我们直接把它打印出来。可以吧,诶这样的方式就行了,就写完了,那之前我们你回想一下Spark,你写毛毛多的代码,在里边一行代码搞定了,对吧,点点点点点点点点完了就结束了。啊,那这个是时间,这个时间对应什么呢?对应你在写SPA streaming。Red里边给的过期时间,你想想看,你在里边放数据以后,是不是给了一个过期时间,还记得吗?是不是给了一个过期时间啊?对吧,这个是不是相当于你给red一个过期时间了,一个道理嘛,对吧,哎,你只照应这个范围的数据,对吧?啊,一样的啊。好,那我们要去做测试,我要开两个端口,一个888,一个9999 OK吧,好,那这边呢,有一个9999,我给它关了啊。重新开一个啊,从八八开始,这是左边正好呢,嗯,左边是8888对吧,右边呢,写一个9999啊。
20:04
这边注意放的是double类型对吧,这边呢是字符串啊。好,那这个东西呢,就搞定啊,把它还是移到左边来啊,那我们先准备一个数据的1001对吧,然后这边呢,是嗯,Double数据23.5,然后时间戳。对吧,咱们呢,给一个,比如说给一个。八啊,给个八,这是八秒啊,注意这是秒,因为乘以1000了,这边呢,我也把这个数据先准备好,但是我没有按回车啊呃,这边呢,给个名字对吧啊341。比如说我们叫三色一随便嘛,你取个名字字符串对吧?啊后面呢,我也给一个八,我先呢两个都一样。对吧,这边给八,这边也给八啊,就两个都一样啊好,那这个呢,我这启动了,但是没有输啊,那接下来呢,我把这个运行啊。
21:02
把这个代码呢,我们打开。呃,打开好以后呢,接下来我们先输这个左边数据可以吧,先输左边啊,那进来,当然我们刚才说了,它这个join呢,是一个内连接,所以你只有左边数据的时候呢,它不会有结果。对吧,那链接光来左边数据肯定不会有结果,那我右边数进去看会不会有结果,两个都是八对吧,都一样,时间间一样,诶出来了23.53和一是不是没毛病啊。这个没毛病吧,对吧,这肯定就能出来。好,那接下来我们要测什么东西呢?测看一下,因为在S里边它的一个桌啊,应该是。多对多的关系,对吧,什么意思呢?比如说我这边来一个1001,然后啊在这写一个。50。50.5对吧,做一个区分,然后呢,这个是九,哎,我涨了一秒钟对吧,那我们就想这个数据大家觉得能不能输出呢,能不能跟这条数据关联上。
22:12
就是这个数据能不能跟他关联上。你觉得?首先在时间上是可以的,对吧,时间上因为是负五到五嘛,你一个八一个九肯定能关系上,那从S个的角度来说,应该是多对多的关系对吧?好,那我回收啊,这就不卖关子了,可以看啊,这边呢,50.53次一对吧,好,那关键的问题在于,如果说我这边再输一个1001。32。这个我也给个九,那大家告诉我这个时候应该是什么现象。我这也给一个九,那这个地方应该是什么现象。
23:11
能不能告诉我应该是什么现象?啊,云总说两条数据,哎,那我们看一下啊,走你,哎,确实两条看啊我们这个。1002不是342,这个数据呢,都是一样的,342对吧,那二十三点五五十点五是不是跟左边两条数据都关联上,所以呢,在弗林格当中,它这个join呢,其实也是一个什么多对多的。Join。多对多的状语,好,那接下来继续听啊,我问大家一个问题。注意此时并行度是一。我ug传递呢,我bug传递跟key没有关系,对吧,我为了不干扰,如果说我再来1001,可能跟前面又关联上了,对吧,我为了这个不干扰,我搞一个什么呢?1002。
24:08
注意看啊。89这个随便写啊。然后呢,我们想一下我们的。数据存多久啊,存个五秒钟是不是。我们数据呢,存五秒钟好,那八。正常的加53,那我给个14啊。我给个14。或者说呢,干脆这样,我直接一步到位给15就八九这两条数据。都超过五秒。对吧,不扯那么多啊,都超过这个五秒钟。好,注意看啊,我给个15,这两个差六秒吧,这个就差更多,差七秒了。输进去好。1002只有他自己,肯定不会有结果,这个毋庸置疑,关键的问题在于,注意看啊。
25:08
告诉我。能不能关联上?就是它是不是也还打印这两条,你看啊,这个十。对吧,跟八九它间隔也不到五秒。还能不能?关联上了。好,那大家的答案呢,都是不能。
26:01
来我们看一下啊。完了。回了。这不能吗?你看三四三二十三点五五十点五,是不是这个数据还是跟这两条关联上了呀。毁了。那有的人说你骗我,你说这个数据会过期,这不是没过期吗。对吧,好来看啊,注意,我继续再来一个。我给个15。对吧,这个呢是15。走一下啊,当然呢,这个1002会出来一条数据,对吧,1002会关联上出来一条数据,我再输这个。再说这个。看没有了。没有了。对吧,说明它确实是会过期的。但是这个东西能关联上又怎么解释呢?注意这个十,我是在这个15之后。
27:04
输入的啊,而且呢,我们的并行度是一啊,我刚才特意强调了并行度是一,这个该怎么解释呢。就是那那为什么就没过期掉。那最终呢,我们测了一下,确实还是真过期了,对吧,我再来十都没用了。这玩意儿。应该怎么解释呢?对于自己的状态计算过期时间啊,云总说两个model。来注意,其实我告诉你啊。我告诉你。我一直给你强调这个东西是一。
28:00
啊,我一直给你强调这个一其实是什么,其实是给你挖坑。对吧,给你挖坑。呃,虽然并行度为一,大家觉得一条数据就够了,对吧,好你看啊,我们呢,这是what ss1这个流吧,一号流这个呢是二号流。它呢,并行度都是一没有问题对吧,但是我对两个流做了什么。哎,我做了join。啊,我做了桌椅,好,那么对于当前这个任务而言,它的上游。你看啊。是不是有两个?啊,我一直给大家强调那个B形度为一对吧,其实给你挖坑。你要注意。这个需求呢,它是join,虽然每个人并行度都是一没问题,但是我们做了join join之后的操作,这边的操作对吧,对于他而言,他的上游是什么。
29:07
是有两个并行度的。啊,所以当我们把两边的摩BG都改成这个15。是不是就关联不上了,就过期了。能懂吗?对吧。啊,是这个意思啊,就给你挖了个坑。懂吗?啊,给你挖了个坑啊,就在于这儿。就是还是我们早上给大家说的那个问题。对吧,Word的一个传递问题啊,那要取小的,你比如说这边单独来15,这边呢还是九,那他word呢,整体对于他而言,Word还是九,那你我B是九,我八跟九两条数据怎么可能会过期呢。对吧,肯定不会过期。啊,那你第二条数据来了个15,这个地方呢,是15,好,那我want整个的变成什么15了,那你八九数据就怎么样,过期了就没了,你再来数据就关联不上了,因为状态里边已经。
30:05
不存在了。OK了啊,这是我们所说的一个点。挺好玩的,这种事情是不是对吧?啊,还是比较有意思的啊,当然这个地方呢,是一个内连接啊,你单独来数据没有用啊,包括最后呢,我们再给他测一下,就是刚才我们一直都是左边先来数据,对吧,那这次呢,我们让右边先来数据啊。比如说我在右边先来一个1003。啊,然后呢,S1吧,我就写少一点啊,这个呢,我给一个随便,因为从头开始了,对吧,给一个八啊好,那这边呢,我写一个1003,你看右边单独来数据也不会有结果,因为我说过它是一个内连接啊,它是个内连接对吧,好1003,然后呢,这边23.5。嗯,刚才给的八吧,哎,给个八对吧,这个能关联上。啊,这就能关联上了,对吧,那就是你已经到15了,给八怎么还关联上,因为我重开了嘛,重开了对吧,重开了这个我bug呢更新了。
31:04
好,如果说你来一个单独的1004,你后面都没有1004了,那他就没了,这个数据丢了。啊,这个数据丢了OK吧,是这样的一个效果啊,大家呢,要去理解一下,当然呢,也不难啊,就刚才我们说的这个坑啊,我一直给你强调B度1B度一对吧,我再给你挖坑啊。
我来说两句