00:00
来给大家讲flink里边的window API,其实从广义上来讲的话,Window API也应该属于前面我们那一部分内容,就是属于这个data stream API,后面大家会看到他做的操作,你开窗嘛,对吧,开窗口你怎么样去开窗呢?它还是基于data stream API去做,呃,Data stream去做的,对吧?所以这个过程我们可以认为它是data stream API的一个扩展,但是这一部分单独拎出来就是因为它比较有特色,哎,它这个用法呢,可能跟之前我们提到的那些用法都不一样,而且在flink里边窗口的定义会更加的灵活,更加的复杂,所以接下来我们专门给大家介绍一下flink里边的window操作啊,那这一部分主要就是先给大家讲讲window的概念,然后呢讲一讲flink边window的类型,最后给大家说一下这个window API到底怎么去调用啊,那后面这个window API的调用呢,我们就要结合这个代码去分析了啊。首先我们来。
01:00
看概念啊,那这里边首先给大家提出一个问题,就是真实我们要处理处理的这个数据流啊,之前我们说它是有头没尾,无休无止的。那平常我们如果要是想对这个数据流去做一个统计,对吧,做一个聚合,做一个转换处理,你到底该怎么做呢?一种方法就是之前大家在这个处理的过程当中,我们定义了一个,呃,你像那个word count对吧?哎,直接把它替外之后,分组之后去做sum,然后或者说我们之前做那个reduce啊,所有的数据一条一条来,每来一条我就输出一个结果word count的话,我就输出当前更新了的那个count的值,那如果说要是那个reduce的话,我就输出当前更新了的那个温度的最小值,对吧?把当前它的那个最小值不停的更新,来一条数据更新一次,来一条数据更新一次。呃,这种应用当然是可以的,它主要应用在什么场景呢?就是刚才给大家说的啊,就是实时去做监控的这种场景,你要实时的看到它的变化啊,那这种的话,那就是每每来一个数,你就把它做一个这个调整就可以了,那往往更多的情况是什么呢?其实更多的情况是我也并你像我们做那个,呃,Work count的话,那应该是从头开始统计啊,这个可能还比较特殊一点,那如果说你要统计最小值的话,温度的最小值,那可能我并不是关心,就是从运行开始,对吧?我这个项目上线监控开始,那可能有可能是几个月几年之前的一个项目了,你从那个时候开始去统计,从头开始算起,到现在为止的最小值,有时候可能就没什么意义,对吧?哎,我更关心的其实是最近这段时间内的一段数据的,它的一个统计出来的一个值,比方说最小值,比方说最近,呃,像我们做这个电商项目,或者做其他的项目啊,近一个月。
02:54
之内的啊,日活对吧,月活啊,或或者说呃,最近一天之内的所有用户的点击量对吧?PVUV,算一下这些场景才是我们更常见的应用场景,那所以这里面就有一个问题了,如果说我想去截取每一段时间的数据去做处理的话,那应该怎么办呢?啊,那大家就看看到了,我其实就是说把这个无界的流,有头没尾的流要去截取有界流了吧。
03:24
啊,那如果说我截取的这个时间啊,就是你像我们说的每天的所有的数据对吧,或者说过去,呃,这这个一个月之内的数据啊,这些其实都是有一定的规则去截取出来的有界的数据,那这样的数据,这就是我们所说的窗口对吧?这样的切分数据的方式,截取有界流的方式就叫做窗口啊,啊那对于flink而言,大家得明确一下这个概念,就是呃,有同学可能可能觉得啊,窗口这个很好理解嘛,那你要这么说的话,那我就是相当于我这儿就就开了一个窗,我就在这等着嘛,呃,你就来数吧,来当前这个我在等着的这个时间范围内,比方说我这个八点到九点,对吧,我开一个窗,我在这等着,那只要是这个时间范围内来的数,我就全放到这个窗口里嘛,啊,这个当然是没有问题的,这是大家之前印象当中的这种这种想法对吧?呃,但是这里面会涉及到一个问题,就是。
04:24
说那你假如说你的窗口定义不仅仅是一个八点到九点呢,假如说诶我们这里边的问题就在于,假如说我不光八点到九点,我要切分一个窗口,我要去去做统计,然后8.05~9.05也要做一个切分,也要统计他这段时间内的创呃这个数据,诶那大家想你这个数据,那那应该怎么样呢?你你到底说这个数据最后统计的时候,你是,呃大家家可能会想到你在九点钟的时候,对吧?呃,你要统计一波,那那呃你到这个9.05的时候,他统计的数据还要统计一波啊,他统计的数据跟我们之前那个九点钟的数据其实不一样的,对吧?啊,所以在底层我们并不是只有一个窗口放在这儿,然后哎,就是按照时间,我就等着,等这个数来了就完事了,而是怎么样呢?就是在做操作的时候,其实窗口它是一个妥。
05:24
它是一个bucket,也就是说数据来了之后呢,会我们会根据数据啊,它到底应该属于哪个窗口去做一个分配,做一个分发,同一个数据有可能可以属于不同的窗口,对吧?啊,那这个时候就是你你想我们这里边这个来了一组数据,对吧?哎,那假如说啊,我现在这个窗口,它并不是直接来一个框,直接把它框起来的这样的窗口,而是什么呢?而是bucket,大家想到这个就是一个一个的这样的桶,对吧。
06:00
哎,所以这样的话,我就不要限制住来一个数据,我当前只有一个窗口,这些数据就只能进入到这个窗口里,而是怎么样呢?来了一个数据,我判断它,哎,比方说这个数据是09:02的啊,呃,08:02吧,前面我们说八点到九点对吧,那它当然就属于八点到九点的这个窗口,对吧?啊,这个是完全没问题的,那8.05~9.05这个窗口当然它就不属于了,所以当前这个数据它就只会进入到八点到九点这个窗口来,对吧,你就把它发到这个桶里边来一份数据就可以了。那后面来了一个,假如说这个数据是08:09的数据,那大就想到了,它既属于八点到九点,是不是也属于8.05~9.05啊,诶,所以这个数据它其实会直接分发到两个桶里面去啊,所以大家不要把这个概念就想的那么局限,对吧?我当前就是直接框一下,这个窗口就是一个框啊,然后这个定死了之后,那就是当前来的数全进这个框,不是这样的啊啊,就是这个窗口它可以是多个,你可以认为它是个桶,来了数据之后可以去做分发啊,这首先是这样的一个窗口的概念,呃。
07:18
我先把这一部分先给大家截取一下啊。
我来说两句