00:00
好,那把这个聚合完成之后,接下来还应该做什么?组对再分组,基于什么做分组对现在基于window and去做再分组,然后是不是就排序输出啊,啊我们用一个process function把它搞定,这里边比方说我叫top n hot URL。那当然这里边我也可以传一个参数,比方说统计前五个top top5对吧,最后就可以data stream,把它print打印输出,不要忘记最后要执行execute,这个我们叫network flow。Drop对吧,啊,就是这样就完成了我们整个这个代码,最后要实现的就还是这个核心的process function了,实现一个。呃,叫什么top n hot URL对吧,这里边把这个改一下,还是叫top size,里边具体逻辑是不是跟之前实现完全一样啊,Extend一个什么。
01:10
大家想一想,现在就是一个key的process对吧?哎。K的process方式,它的类型KIO,这里的K是。Window and window and的类型是long对吧?Long类型input是URL count输出,如果我们还是控制台打印的话,那还是把它包装成那个string对吧?用一个string builder,一个一个pad信息上去,然后把它打印输出就可以了。所以上面不报错了,下边我们来做具体的实现。要写一个process element,对吧?来一个数据到底怎么处理,把它写进来,来这里大家注意我们是不是还是来一个要把它保存到一个一个状态里边去啊,一个list state,对吧?之前我们是前面定义了那个open,呃,生命周期,在open生命周期里边去把它状态生命出来,获取到状态距离,那在这里我们还有另外一种方式,大家还记得吗?
02:18
不在生命周期里边也可以,我们可以在外面怎么定义呢?是不是可以直接去lazy定义一个呀,还有这种方法对吧?啊,这种稍微简单一点,我们用这种啊URL state,它是一个list state。URL welcome。这个要引入一下。啊,那么它怎么去定义。上下文里边get wrongtime contact,然后get list state,对,获取句柄,这里面要传一个script描述器,这是list state script这样一个东西,对吧?那这里边要给一个名字,呃,这里边我们就叫u IL state,后边要传它的类型class of URL。
03:15
No URL will count对吧?啊,这是我们当前的状态的数据,练习好,然后接下来就是每来一个元素就要存到状态里边去。所以。直接操作状态点ADDADD,把value是不是直接ADD进去就可以了,哎,直接就是这么简单。另外还要。注册一个定时器,定时器怎么注册来着?Ctx time service对吧,一个even的time timer,对这里边的时间戳用是不是就用我们之前数据里边的那个window and对吧?啊,再加一就可以。
04:04
这里边value.window and加E啊,当然这个按大家自己的习惯,呃,可以随便设置对吧,这个都可以,另外还得去实现一个,对,还得实现一个触发,呃,就是当我们时间到了这个定时器的出发时间的时候,该做什么操作对不对啊,触发这个定时器的操作,那这里边是不是要去实现一个on timer方法啊。这里面我们做什么操作呢?这就是从状态里边拿到所有的东西,对吧?啊,这里还是给大家把注释都写出来啊,自定义域聚合函数。自定义。窗口处理函数。
05:01
这里面是自定义。呃,这个根据窗口的那个不同的窗口再去排序对吧,排序输出处理函数。啊,所以这里面我们真正就要排序输出了,首先从状态中拿到所有数据。呃,这里我们会先定义一个一个list buffer,对吧,这里边叫all URL views,当然它里边的类型是URL count。你有一个list buffer。然后接下来呃,我们就该便历那个状态了,对吧?啊,之前我们的便历是用了一个那个for循环啊,挨个去便历那个还得引入一个那个那个Java convers那样一个呃,一个包,对吧?我们如果觉得麻烦的话,大家会想到这里边我们的状态本身是个什么东西呢?它要拿它的时候是不是点get呀,Get之后返回的是一个。
06:19
大家可以看到啊,这是这个是我们这里边本身out类型。诶,大家看到啊,这里边是不是本身就应该返回一个,呃,当前这个out类型的对应的这样的一个一个状态类型啊,对吧,但是这里边本身它是一个可迭代的类型。它本身有for操作啊,也还有一个迭代器操作,对不对。我们可以直接用这个迭代器。用这个把它做一个便利。这里我们定义一个ER,它就等于它的这个迭代器,然后怎么迭代呢?怎么便利呢。
07:06
对,是不是。他如果has next的话。我们就把当前的那个next读出来,写到all URL view views里边去,对不对,所以点next,对,这样就搞定了。啊,这是另外一种读取的方式啊,大家可以自己尝试不同的方法,当然了,然后接下来我们就可以去做排序了啊,可以把这个已经读进来,大家如果想清空状态的话,也可以直接清空状态了,那我们要清空状态就URL state.clear,对,然后排序sorted URL views。那就等于all UI bills去做salt by或者thought with,对不对?之前我们用的是thought by,这回我们用一个thought with吧。
08:05
可以怎么写?啊,这里面是不是得传一个函数啊,对吧,就是相当于啊,你按照什么什么样的一个条件,然后返回一个呃,这个布尔类型的一个值,对吧?判断它是否这个大于或者小于就可以,所以我们一般可以怎么样写,是不是它的count只要大大于下划线count就可以了,这是不是就代表按照count值。从这是从低到高还是从高到低,这是从高到低对不对啊,大于它返回一个处对吧?啊,这样的话就可以从高到低把它降序排列,后边我们再take出top n对吧,Top size把这个进去就可以了,这就是我们的这个排序处理的过程啊好,接下来我们就是要把对应的排序结果打印输出了,对吧?格式化结果输出。
09:11
我们还是定义一个result,它是一个buffer string builder。呃,去你一个string哦,前面我不应该不应该这个。它是一个string builder,我们去把它创建出来,创建一个这样的对象。然后接下来是不是就是往上的判子就就完事啊,一点一点的判的啊。首先还是定义一个,比方说时间窗口是在什么时候关闭的,后边A这个A的时候,我是不是要把那个time standmp转换一下啊,所以是new一个time standmp,然后把时间戳传进来,对吧。
10:11
呃,我们的时间戳就是当前的time stamp还要在对,当时是window and加一,我们要把那个window and输出,所以是不是time stamp要减一,这样做操作对吧?好,然后最后可以在A的一个杠N做一个换行输出,这是当前一个时间窗口输出这样的一条信息,下边是不是要便利我们排序好的那个salty的ul views,把每一个对应输出一行,所以是一个for循环,哎,当时有一个写法大家还记得吗?这个I是不是直接遍历角标就可以了,所以是salty的urls点对Indies。
11:03
首先我们先把当前的这个拿出来,URL view,它就等于呃,Salty的UR views。的第二个元素拿出来对吧,然后接下来result往上添加。呃,比方说number是第几个对吧。后边还得得number几,这里当前是第二个啊,那应该number是要加加一,因为I是从零开始的。然后再end的一个冒号result,呃呃,这不用啊,我们直接在后面继续添加就可以,对不对。继续添加,接下来它的URL是什么,我们空一格啊,URL是什么跟在后边。
12:03
U应该是哪个元,呃,这里边取哪个字段,当前元素,当前current URL view这个里边的是不是就是URL啊,就拿出来就可以了,后边继续ipad的一个,呃,它的当前的访问量对吧。这个访问量就是current u的count,对,就把这两个值拿出来。最后再加上一个回车换行,这样就输出了啊,当然所有的这个呃,For循环结束之后。我们可以输出。来一个分割,每一个窗口分割开来,方便显示。另外还可以干什么,控制一下输出频率对吧?隔一秒钟输出一条,最后什么怎怎么样才算真正的输出呢?这才是把这个result包装好了,最后还要out点才是真正的输出,Result to string转换。
13:20
这样我们就真正完成了整个的这个代码,好啊,那那大家会想到这里边我们用了一个loud lateness,它输出的结果会跟我们之前这个有什么区别,有什么不一样呢?好,这个我们先来看一看它的结果是什么样吧,测试一下。好,大家看,启动之后我们等待它输出结果。好,大家看现在是不是有了一个结果的输出啊,然后我们的要求应该是。应该是五秒钟滑动一次窗口对吧?输出一次,呃,然后大家可以看到,呃,我们会把这个当前访问量最大的几个URL全部输出出来,那这里边大家需要注意的一点是这个这里边大家看到有一个什么问题啊对,是不是这个这个URL访问量最大的往往都是些什么呀?对,都是些图标啊,CSS啊,或者说P这图对吧,都是些这些东西,因为访问的时候它是有资源的,这个获取的嘛,这其实并不是我们想要的那个某个页面,或者说某个网站站点的那个URL,对吧?呃,所以大家如果要是说想要去解决这个问题,不想呃它总是这样一个状态的话,我们可以有一个什么样的解决方案呢?对,是不是可以做一个正则过滤啊好,所以呃,这就是我们这样的一个测试结果,大家看到也比较符合我们的预期,就是每隔五分钟输出一个。
14:53
窗口的统计结果,大家可以再写一个正则,把这个URL做一个筛选,得到自己预期想要的那样的一个状态。
我来说两句