00:00
窗口里边一个窗口算子分为两部分,一个是窗口分配器,一个是窗口函数啊,那其实之前time盘auto的时候,大家也知道,其实也是两部分啊,一个是auTo Generator,一个是time step,有点像啊,但是呢,当时他是把那两个都包装在一个策略里了,反而比较麻烦,而我们现在呢,分成两步,其实反而会稍微的清晰一些,会更加的直观一点,所以接下来我们就先看一下窗口分配器。Window。前面我们已经说过,它主要就是决定。数据到底分配到哪个窗口,那它其实就是在指定这个窗口的类型啊,啊,它最通用的方式就是直接调点window方法,然后里边呢,传一个参数,一个window a sign啊这个就是又是一个大家一看这个模样啊呃,那就是不是一个类,就是一个接口嘛,所以就是要实现它啊,那这里大家需要注意的是,如果是调这个点window方法的话,这是KB之后才能调的。
01:03
那如果是不KPI呢?不可的话,调的就是点WINDOW2方法,然后同样也要传一个window a sign,但是呢,他们返回的数据类型不一样,也就是说调用了这个window方法之后。之前如果是当前定义了一个算子的话,返回的不就是一个single output stream operator吗?那现在不是,因为它,它和后边的窗口函数合起来才是一个operator,所以它有点像那个K一样,它返回的是一个window the street。是一个这样的东西。而如果是调window or的话,返回的是一个all window the stream。啊啊,那接下来我们就来看这个对应的不同类型的窗口到底应该怎么样去定义了。一个一个来看,呃,我们在代码里边给大家做一个测试吧,还是。这里我们就是。
02:01
被完全的复制。Mark这里的一些定义。因为我们知道现在正常来讲的话,在我们开窗口的时候啊,肯定往往是要开这个时间窗口,那时间窗口的话,当然应该视线时间嘛,当然然也应应该有这个时钟,时钟是以这个watermark指示的,所以我们需要有这个watermark啊,放在这里就可以了啊,然后接下来我们就看一下这个。低于当前这个stream怎么样去做操作呢?怎么做窗口操作呢?先做KBY对吧?啊,那KBY的话,这里边一个AK select,我们可以直接用一个拉姆达表达式来指定当前的user。然后接下来就是window.window对吧,可以看到window返回的是一个window the street。一个这个东西里边传的是一个window a sign a signer是一个抽象类。这抽象类里边看到。
03:00
有一个有一个非常重要的方法,就叫做assign Windows,这就是相当于告诉了我们当前的这个window到底应该怎么分配数据对不对?当前的这个数据应该分配到哪个窗口里边去,当然了,如果我们自己想要去实现自己自定义窗口的话,那你就得去呃,实现对应的那个抽象类了,好在这里边我们不需要自己实现。所有的那些类型的窗口,Flink都给我们已经有预定义的实现了,比如一开始我们不是讲了这个有这个时间窗口和技术窗口两大类,继续再划分的话,时间窗口里面就会有时间滚动窗口,时间滑动窗口,还有规划窗口,那与这个技术窗口呢,会有滚动的技术窗口,滑动的技术窗口,大概是这五大类。然后如果具体再分的话,时间窗口里边是不是还有处理时间和事件时间啊,所以这个其实还是挺多的啊,我们每一个都给大家大概的说一下。
04:05
在这里首先第一个类型,我们就看这个所谓的滚动处理时间窗口是最简单的啊,还记得那个滚动窗口叫什么名吗?这就是当时给大家说的必须要记住英文的那个原因啊,这要用window里面得传这玩意儿的啊,其实在之前啊。在以前的版本里边,时间窗口很简单,大家看可以直接啊太模斗直接这么去用。但是现在time window被启用了,就是这个API被启用了,推荐用什么呢?用更加通用的方法,点window,然后传一个window sign啊,那这里边传的是什么呢?你看传的就是这样的一个东西啊,Tumbling even time Windows tumbling processing time Windows,为什么要用这种方法呢?哎,就是因为这样传的话,非常明确的指定了我到底是事件时间还是处理时间。这就不用纠结我当前到底是什么时间语义了,如果你这这里不指定的话,我们还得去指定那个时间语义的,这是以前的老版本的做法啊啊,所以现在现在就统一就把这个器用变成window,那这里边如果是滚动的。
05:15
线时间窗口的话就是tumbling even time Windows,然后点of,里边of的话主要是有两种啊,后面这个sta大家不用管啊,它有两种形式,一种就是传一个参数S,那其实知道啊,普通窗口就一个参数对不对啊,那这里边我们直接先把它写出来吧,然后里边这个of里边要传的这个类型啊,这个time,那time又是什么呢?这个大家要注意啊。哎,选包的时候一定要选,因为很多地方可能都有time这个类啊,就flink stream API window time.time啊,所以这里边我们是这样写的。Time。点啊,那这个随便取了,比方说我们取一个一小时的时间窗口,哎,大家看事件时间窗口一小时这么去定义了。
06:03
所以这是质件。时间。滚动窗口,或者按照这个字面翻译的话,应该叫滚动事件时间窗口,对吧,还是按照这个字面翻译吧。滚动事件时间窗口。类似的当然还有tbling time啊,我们就先把这个事件时间的窗口全全都搞定吧。Liding,大家还记得那个滑动吗?Ledding even time Windows这个也可以啊,后的话应该有两个参数了,大家看这个是一个带子,一个slide,所以这里边是两个,一个是当前的大小,比方说一小时,然后还有一个滑动不长,比方说五分钟滑一次,诶,这是一个。是一个滑动。是。见时间风口。
07:00
刚才大家其实看到了个二方法,里边还有其他的一些调用的方式。我们先看滚动的方法,里边除了只传一个size之外。还有另外一个还一个time time不是滑动步长对吧,因为滚动窗口吧,这个time是一个offset。是一个,是一个偏移量,这又是个什么东西呢?前面我们没说一个问题是我们说这个滚动窗口只有一个参数,就是当前的大小,那如果说我们要定义这个一小时的窗口的话,那我们自然就想到了,那就是整点吧,八点到九点,九点到十点,十点到11点,那我为什么就一定要以整点开始呢?当然了,整点最方便,所以这里边我默认当然就都是整点的,那如果我就特别的膈应,我统计的不是整点,我的表比别人差一点,我要统计的一小时窗口偏偏就是8.05分到09:05。然后9.05分到10:05。
08:04
这样一小时一小时的往后错,这是不是也叫做一小时的滚动窗口啊,因为正常人想,你如果创建一小时滚动窗口,那应该是时间戳从零开始嘛,当然就是就是整点了,那你现在呢,如果非要把它往后去挪五分钟,那是不是这相当于窗口的起始时间整体偏移了五分钟啊,哎,所以这个偏移量就是干这种事儿。那有人就说了,有啥用呢?这莫名其妙啊,你看这个源码里面的注释,你就看得很清楚,他在一种场景下非常有用,干什么呢?时差啊,就是这就是假如你开的是一天的时间窗口的话,那我们统计,我们在这里统计这个一天时间窗口的时候,你用那个时间戳,大家知道你的时间戳一千两千,本来是一秒两秒啊,已经都是1970年1月1日啊,八点。0001秒零二秒了,哎,为什么是这样呢?因为我们的时间比伦敦时间快八小时啊。
09:03
呃,那我现在我要统计的是北京时间的一天啊,那我统计的不是伦敦时间的一天呀,你按照那个时间戳从零开始整天去截的话,那是伦敦时间的一天,那我北京时间就变成了每天的早上八点到第二天的早上八点了,这怎么办呢?加一个负八小时的偏移量,这还挺有意思的一个用法,那同样就是sleding window,这里边也有另外一种方式,就是传三个参数,嗯,第三个参数,第三个参数就是offset。一样道理啊。这是。这两种不同的用法。呃,然后除了这两个之外,我们把这个直接放到下边来吧。然后注脚。然后除了这两个之外。另外还有一种类型的时间窗口,那就是session window。这个定义不一样了啊。这个应该叫event太。
10:01
Session Windows看到是这样,Even time session Windows,然后里边如果要定义的话,那就是with GA。它也可以动态,我们说可以动态提取对吧,那就是with,一般的话就是静态就可以了,就是之前我们定义的那个保持时间它为准啊,比方说我们这个是呃,就是两秒钟,那给一个这个就是。事件时间,会话窗口。啊,其实整体来讲还是非常简单的啊,不是直接这么定义就完事,好直接把这个放在这儿啊,那至于这个,如果你要定义processing time window的话,这个完全一样啊,这里我们就不一个一个列了啊,只不过就是把这里的even time全换成processing time就完事了。然后这里面需要给大家说的是,还有这个技术窗口,技术窗口怎么定义呢?技术窗口更简单。Count window啊,这个没被弃用啊,就是早期是count window time window就直接可以定义,我们现在是time window不再用了,用这个点window统一定了,现在呢,Count window还保留,Count window里边count window怎么样去定义呢?那就是有两种参方式,如果只存一个参数的话,因为它不涉及到这个偏移量嘛,也不涉及到这个,呃,绘画窗口的这个问题嘛,所以就是只传一个参数,就是滚动窗口,传两个参数,那就是滑动窗口,哎,所以这个其实很简单的一个实现啊,那里边大家点进去源码也看得很清楚,用的是什么实现的。
11:30
Global Windows,然后自定义了trigger,就是我们说的触发器,这里还有一个艾,艾是什么呢?哎,是一个移除器,就是定义哪些数据不要把它移除出去啊,这个后面都是可选API啊,最后我们会给大家做一个简单的介绍。啊,那所以这里看到window,我可以比方说十个数统计一次,然后呢,每隔两个数啊,就滑动一次去做一个统计,这也是完全可以的,所以这是一个滑动技术虹口。
12:01
滚动的话,那就是只取一个,只有一个参数就OK了,这个就不再去写。当然了,这里还报错,那是因为我们还没没有把当前的这个window算子弄完,只得到了一个window的stream,并不是data stream啊,所以还要做继续转换,必须定义窗口函数才代表完成了一个窗口算子。这就是关于窗口分配器的所有的内容。
我来说两句