00:00
接下来我们要给大家讲的是实用性更强的一段代码,在很多网站里边,特别是电商啊,大家知道电商里边的话,我们往往是要统计有哪些商品是热门商品啊,或者有些网站也是统计的时候啊,我们要统计这个哪些URL的那个访问是最大的啊,就哪些页面是热门页面,这个是经常要统计的一个,那统计这个热门页面的前提是什么呢?前提是你得根据URL,把每个URL对应的访问量要统计出来,然后再去做这个排序啊,做其他的那个选择,所以现在我们可能想到这个排序稍微有点麻烦,那我们现在能不能直接就先把每个URL页面的那个访问量按照窗口啊,一般这个统计都是基于窗口的,按照每个窗口划分每个URL,统计出他们分别被点击被访问了几次呢?啊,这个其实非常简单,有了前面我们的这种用法,那自然就是很容易可以用一个aggregate把它做一个实现,那我们就快速的来实现一下这个需求。
01:09
呃,那这里我们这个需求就叫做URL count,之前我们是UV,那相当于是user的一个一个count,那现在我们是URL的,就是每个URL访问量的一个count,所以我们叫count view吧,啊count它的访问访问量。然后example。这在实际应用当中也非常的有市场啊,就是很多需求我们都要访问热门嘛,啊,那那现在是一个相相当于先做第一步,我们先去解决一下它到底怎么样去聚合啊,按窗口把这个个数URL的访问个数先聚合起来。这个就不用说了,肯定一开始还是这样对吧,我们直接把这个打印的这一块也直接列出来吧,风电执行环境,然后啊,这是全局的一些设置啊,为了方便我们看这个顺序,然后接下来读取数据源,Click source,乱序流,Auto生成,其实我们这里边没有乱序啊,有序的是zero啊,然后接下来。
02:09
把这个做一个打印,接下来就是。就是开窗,那首先我们是。按照之前我们是所有数据都在一组里边,因为要统计所有全局的这个PV嘛,那现在的话就不一样了,当时我们还说你统计所有数据的话,这个容易分发到同一区,这数据倾斜了,我们还应该再把它分开,拆开之后再合并,实际应用一般是这样的,那像现在呢,那就正好了,我们是需要统计每个。URL的访问量,那是不是直接就应该根据URL做一个分组啊啊,所以接下来其实就是dream直接keep当前的URL。点URL。然后接下来开窗。那当前我们还是。
03:00
因为之前已经练过滑动窗口了啊,我们就还是滚动窗口吧,这个最简单一些啊,没关系。我们时间短一点,十秒钟只是一个示意。时间太长,我们等不及,然后接下来直接aggregate了,那这个aggregate我们自然想到了,还是应该来一个增量聚合,因为你这个统计,这不就是当前URL的只要来了一条数据我就加一吗?只要来了一条数据加一吗?那聚合状态就一个,就一个长整形,或者一个一个inte,一个整形就完事了嘛,啊最后你要统计的结果可能还想要包装成一个特别的一个样子啊,之前我们是直接string打印输出了,那现在呢,我们给它包装一下吧,因为实际在应用的过程当中,你可能拿到这个统计结果之后,后边还要做处理,就我们说的,你可能还需要把它做排序呢,哎,那这个怎么办呢?那我们包装成一个,我们想到应该包装成什么样子,应该有当前URL到底是谁,然后呢,它的访问次数是多少次,这个页面被访问了多少次,另外还得有窗口信息。
04:05
啊,那窗口信息的话,我们知道了,那后面你又得跟全窗口函数了,对吧?啊两个。结合在一起,然后实现我们的这样一个应用,那大家看这最后的输出好像是一个三元组了,三元组哎呀,这个类型展开就有点麻烦,在实际应用的过程当中,你不想总写元组类型的话,那就自己去定义一个抛类型嘛,我们就得在外边单独实现一个,比方说我管这个叫做y l view count吧。URL被访问的这个次数。边的字段我前面已经说了。首先。一个string类型的URL。然后接下来。一个长整形的。好,那接下来再接下来啊,应该要有啊长整形的窗口的起始时间和结束时间啊,Window start。
05:03
和window and,呃,我们还是直接把它作为长整型保存下来。还记得之前我们那个link要求的po类有哪些,有哪些特定的需求吗?首先必须要有一个空参的构造方法,当然了,为了方便构建它,肯定这个带参数的我们也得创建出来。另外我们重写一下。提卷方法,好,那那这里我们还要把这个所有的类型,所有的属性啊都定义成public,而且它们的类型都是可序列化的,如果要是在这儿想要去做two string的话,那我们这里就直接把它包成呃,New time Sam,然后to string,年月日十分秒打印出来就完事了。同样的,下边也是window and包装成time。打印出来,好,这是我们提前定义好的这样的一个肉类啊,然后有了它之后,接下来我们知就知道要干啥了。
06:03
我们其实就是要自定义两个。函数一个是一个增量聚合函数,比方说我们这个叫做啊URL view count吧,还是叫view count a做一个增量聚合,然后后边呢,那是要一个URL u hunt result。包装空前的定义好的那个封口的信息提取出来,包装成一个定义好的。URL count这个类输出就完事了。啊,那那自然我们就知道接下来的关键。不就是像。我们先把这个该写的都写出来啊,接下来关键不就是像之前一样实现这两个自定义的东西吗?啊,那首先public static。复制过来,这里边我们知道它是一个aggregate function,一个接口,这里的类型要注意,本来是even输入,然后中间聚合状态,不就是一个长整形吗?那计时器嘛,我们说来一个加一嘛啊,就是一个个数而已,那最后输出也就是这个个数嘛,所以输出的就是当前的状态,两个类型完全一样。
07:19
把这个一写,里边的方法,这个太简单了。行整形的这个这就是个计数器嘛,不只是零来一个就加一对吧,Accumul加一啊,然后at result也就accumulator是这样。再简单不过了啊,直接这么一改就就搞定。然后接下来要实现这个包装窗口信息。包装。窗口信息输出URL count啊上面这个是。能量聚合对吧。灯亮,聚合。
08:01
来一条数据就答一。那后面当然输出的就是我统计出来的个数了,反正这里边我们要做的是public static class来copy一下。注意,Process window function是一个。是一个抽象类process window function,它的参数输入,它的输入是前变增量聚合的输出,也是长整形那一个数,然后它的输出呢,输出得是URL count,对吧,就是我们定义好的这个port类,然后还有当前的K,当前的K是什么呢?这是URL,哎,那那这个应该是string类型了。不要无脑醒对吧,这个你要看具体的场景啊。好,Time window这个时间窗口还是没变的。接下来我们要做的这个process操作呢,那里边这个其实就差不多了,其实这个我们甚至都可以直接copy这里的东西了。
09:09
不,还是。一个。Start,一个and,先把这俩东西都拿到,然后最后要输出的就是out.collect然后去new一个URL will count写进去不就完了吗?那现在我们要的首先要URLURL在哪呢?啊,URL就是当前的K嘛,所以在这儿呢,对吧,哎,我们把这个改一下,这个叫URL。那这就是URL后边,后边还需要有当前的那个count值,Count值在哪呢。不然是在elements里了,这就跟我们之前取那个呃UV结果一样啊。代替,然后接next,回到就这一个数合起来用。那么这里就是can。后,最后,那就是that和and。
10:03
就是我们要做的所有的操作。好,接下来我们看看这个效果怎么样吧。哦,这里我们看到西安市有。几条数据输出好,然后大家看到这里边直接输出了两个URL view count,为什么呢?啊,它是针对URL来的嘛,这里边你看在这个啊,这是十秒的数据,这个不算对吧,后面这个不算上面这两条。是不是只有两个ul啊啊,出现了两个ul分别统计个数都是二对吧,Count都是二,没有毛病,当前的这个范围是。六分整到六分十秒,所以最后这个六分十秒啊,触发的这个窗口计算的这个数据没考虑在内啊,这是这个计算的这个结果啊,然后看第二个十秒,呃,就是六分十秒到六分20秒的这个数据,诶,上面最后一个这个数据不算,上面这有几个呢?哎哟,这就多了啊,大家看这五个有五个URL都有,然后呢,呃,Home和这个。
11:05
PRODUCT100是三次,然后PRODUCT200是两次,Cut和FA都是一次,这大家可以对比我们上面的数据啊,一目了然就能看到我们这里输出的结果都是正确的,因为我们前面做了KBY,所以窗口的统计,统计结果也是针对每一个K做出的结果,那自然我们就想到了,然后我们把这些数据都收集起来,按照这个count值做一个排序,这不就能得到top n了吗?就能得到热门的页面到底是哪几个,热门的商品到底是哪几个了吗?啊,这个后续我们会讲top n到底怎么样去取。
我来说两句