00:00
那UV本身是什么呢?啊,UV前面我们那个是page view对吧,这里边不是那个user view,而是unique visitor就是独立访客数,所谓的独立访客数就是。诶在一个时间段内,比方说一小时之内啊,那个有多少不同的用户,首先用户能区别开不同的用户访问了这个页面,大大家说这个不同的用户又按什么去区分呢?对最好的方式当然是用户ID去做区分啊,那这里面我们能获取到当前是买点日志对吧?电商平台里面一般都是登录之后,然后去做操作的,那你可以获取到用户ID,那假如用户没有登录呢。没有登录的话,那是不是就得用其他的一些指标了,比方说我们用这个,我们是不是可以针对不同的IP去做一个筛选,判断它是不是同一个用户,对不对啊,那当然有同学可能说这个IP这个统计比较简单,但是可能会有问题,因为有一些它那个程序连接的过程当中,也有可能去去换IP,或者说有有有各种各样的这种这种情形对不对啊,那这里边还有另外一种方式是怎么样去操作呢?
01:21
浏览器去连接的时候,是不是可以有一个cookie啊啊,那么可以在互相之间保持这个连接的时候,我们用cookie去判断用户的这个身份,这也是平常常见的一种操作手段啊,当然这就是在没有用户ID的时候,那就只能用这些方式了啊,所以大家就是也了解到平常常见统计UV的这些手段和方法,当然对于我们这个例子而言。我们还是基于这个买点数据,它里面也没有IP,那而且这里面有user ID,那这个就比较简单了,对吧,所以我们直接根据这个不同的user ID把它筛选出来就可以了,那所以在这个过程实现的过程当中,最核心的问题在在哪里啊。
02:05
跟前面的PV不同的地方,核心的问题。对,在于去虫,呃,别的其实都没什么,都没什么不同,关键就在于每一个这个数据来了之后,我得判断它到底是不是在之前已经出现过,然后要去做一个去重,所以这个过程大家想怎么去实现呢?怎么去实现这样的一个东西啊。哎,所以这个东西的话,好像就没有什么好方法,那是不是我就只有把这一时间段内所有的用户都存下来对吧?然后来了一个数据,是不是比对一下,遍历一遍对吧?看看这里边到底有没有,如果有的话,诶那就不要算了,如果没有的话,是不是就算一次UV,呃,UV加一对吧,然后然后再把这个新的这个user再添加到我们的这个,呃,存储的这个空间里面去,所以只有这种方式去做去除去除,那所以接下来我们就在代码里边做一个具体的实现。
03:11
大家会想到在代码里面要去实现这个驱虫的话,那我们把把这个东西保存在什么样的数据结构里呢?Set是不是就非常的合适啊,因为大家觉得知道这个set有一个特点就是啊,对,就是没有重复元素,那自动相当于就给我们做了一个驱虫,我们直接来一个数,把它往set里边扔,然后最后我们要输出结果的时候,是不是判断一下set的大小就可以了呀,对吧,判断一下里边到底有多少个就可以了,所以这个其实整体来讲还是比较简单的啊,我们重新新建一个叫unique visitor UV啊,那这里边的这这里边的这个主体的流程跟这边几乎完全一样,我就直接从这边抄了啊,先创建环境,然后定义数据源,对吧?呃,这个数据源都一样啊,现在然后把它包装成user behavior。
04:11
分配时间戳和这个,呃,分配时间戳wma的话就不用了,这里边升序数据,然后只统计也是只统计PV操作对不对,还是点击嘛,呃,当然是不是后边这个map就就不能抄了,后边可能会不一样啊,我直接抄到抄到这里。呃,这里我们还是挨个给大家引入一下啊。哦,No。哎,什么情况。对,好像出了一点状况啊。
05:06
哎,这个这个为什么直接这个快捷键引入不了了。好,刚才的这个奥键好像有点问题啊。好,我们把这些先引入,大家注意要把这个要还是把它,呃做那个影视转换的那个type info的转换要引入啊,然后后边我们做这些操作,做到这个filter之后,接下来。要去干什么了?接下来是不是应该得去做驱虫处理呀?啊,那那这里边大家会想到这个驱虫就比较麻烦,我们干脆怎么样吧。干脆把所有的数据先收到时间窗口里边去,对吧,是不是应该是在窗口内做驱重啊,你要不要不然针对所有数据去去重,这个显然窗口输出的时候也不对,对不对,你一个用户在这个窗口里边,呃是在在这一小时里边点击了一次算一次UV,下一个小时里边又点击了,是不是这个窗口也应该算一次UV啊,对吧?而而这个情况你不要去去重,所以是针对时间窗口而言的,我们是不是先开时间窗口,所以time,哎,这里边如果要是我不做KY的话。
06:36
那是不是就直接time window2啊,啊,这里边我们用这个time window2来实现一下啊,当然这里边还是这个开一个一小时的滚动时间窗口。2S1,然后接下来啊,大家会想到我就得去做一个窗口处理函数了,这里边是不是我得把所有数据收集起来,然后应该把它们是不是挨个都塞到一个set里边去,然后判断一下set大小就可以了啊其实这个处理过程非常简单啊,就是思路非常简单对不对?所以这里边我直接可以应用一个apply方法,这里边是不是自定义一个apply function对不对,这里我叫UV by window,呃,当然我们可能这里边输出的这个数据类型呢,还希望包装成一个,呃,就是看起来更加明显的数据类型,像这个我们直接这么输出的时候好像。
07:45
好好,好像是不是特别的这个含义明确对吧,所以我们还是定义一个样例类吧。比方说我们就定义一个叫UV count的这样的一个样一类,这里面包含什么东西呢?我是不是可以把那个把想要的那个window的信息放进来啊,对吧,当前是哪个时间窗口输出的啊,这样的一个UV的值啊,所以这里边我可以定义一个window还是定义一个window and吧。
08:19
那这个video是一个浪类型,然后当然还会有一个UV count啊,这也是一个浪类型。好,然后接下来我们就是实现这个no u we can't by window对吧?啊,它这个东西要实现的是一个什么。前面我们做了type window or,然后这个是所谓的ainer,对吧,然后接下来要实现的就是一个。
09:03
Window function对不对?Window的聚合操作啊,可以我们可以去定义聚合操作,也可以直接收集所有数据,是不是给一个window function啊,所以大家看这里边apply方法里边是不是能够实现的,可以直接给这个window function,也可以定义语句和函数,对不对啊,或者我们直接给这个all window function就可以了,这里我们要给的就是一个。A window的all window function,它里边要传的是不是还是一个印一个out,一个一个window类型,比之前的那个window方程是不是少了一个key啊,对,所以这个大概还是一样的,因为它没有做k buy嘛,所有数据全放在一起做操作,那这里边input是什么?是不是有样例类,User be behavior output,是啊,又是一个样例类,对吧?
10:02
是不是UV抗?那么window类型是time window。好。把这个引入之后,前面就不报错了,所以这里边我们关键要实现的就是一个。Apply方法对吧?呃,在这个apply方法里边,我们主要做什么操作呢?是不是要定义一个定义一个LA set。用于保存所有的数据并去除,那所以这个set里边主要保存的是数据里边的什么呢?是不是保存的就是那个user ID啊,对吧,我不需要把所有的数据都存下来,对不对,我是不是只要把那个每个数据里边的ID放下来就可以了,所以存的就是每一个数据的user ID,然后去出。
11:07
那我定义一个ID set。那是不是可以定义这样的一个,它里边的类型是不是应该是ID是user ID是什么类型?是浪漫型对吧,所以这里边我们用这个。浪类型的一个set啊,然后接下来把当前窗口所有数据。收集到呃,数据的ID收集到set中,呃,那么最后我们是不是只要只要输出它的大小就可以了,对吧?最后输出set的大小。
12:03
啊,那这个apply的这个过程,相当于我们是不是还要遍历这一个所有的数据啊,那所有的数据在哪里呢。大家看一下这个PLA参数传传传入的参数window啊,这是窗口信息input out大家知道了,最后我们输出的时候包装成UV count去输出,对吧?那这个input是不是就是所有数据都在这里了。那英布的是一个可迭代类型user behavior,对吧?那怎么样去迭代它,便利它呢?啊,那当然也可以,我们直接用每一个定义好的user behavior,用它里边的数据对吧,便利,然后是不是把每一个都添加到ID set里面去啊,把每一个的ID添加进去,这样就可以了。
13:02
啊,当然这个放循环完成之后,就相当于把所有元素的ID都加进去了,自动就做了驱虫,那最后是不是直接输出啊,out.collect输出的是一个UV count前面是一个window and,对吧?那是不是要从window里去get end后边是一个count count是什么?ID set.size直接输出是不是就搞定了啊?所以大家看其实其实就是这样啊,就非常简单,把它保存到一个size set里边去,呃,做一个去除。啊,当然了,如果大家觉得这个内存有点不够的话啊,那是不是可以把它放到这个里边去做驱虫啊。那假如说出现那个很极端的情况,对吧,一个窗口里边几亿条数据,几十亿条数据,那怎么办呢?哦,那就是后面要给大家讲的,可能我们用别的方法,可能用一个不能过滤器,对吧?啊,这里我们先跑一下吧,大家先记得之前这个做这个PV的时候,得到的是大概四万多五万多这样一个数据,对不对,我们现在跑一下这个UV,看看做了这个驱虫处理之后,大家能想到这个结果应该是什么样少一些。
14:23
应该要小一些对吧,好,我们看看吧,诶哦,这里边为什么没输出呢,没执行,对少了一步啊,所以这里边是UV drop。好,大家可以看到这个输出结果啊,现在UV统计出来的话大概就是啊,大概就是只有呃两万多三万多这样一个水平,对不对啊,当然最后一个就还是13,说明这这13个点击都是不同用户点的啊,那前面这个统计是不是大概少了一万多啊,所以这个驱虫还是很明显的啊,这个操作得到的结果还是很明显,这就是我们对这个UV的一个实现。
我来说两句