00:00
啊,接下来再给大家讲另外一部分跟市场营销相关的一个统计指标,这个就是所谓的页面广告的一个统计分析啊,那对于这个很多电商电商网站而言,其实这个广告上的页面上的广告投放也是一个重要考考察的方面,对吧?啊就是关于我们这个做市场营销的时候,一方面可能是涉及到就是自己的这个APP啊,就自己的这个业,呃,本身的这个APP要去做推广网站要去做推广,在别的页面上来做的这个广告投放,那另外一方面呢,可能也要考虑的是我本身这个APP自己页面内部可能也有一些广告的插入,那有一些收费标准,对吧?哎,那你说你针对这个呃,别的一些应用或者别的一些呃客户啊,他要在我们当前的页面上去打广告,那你的这个广告的定价,广告的一些相关的一些这种规则,按照什么来去统计按照什么来。
01:00
定义呢,一般情况下大家可能知道做广告嘛,那肯定价格,如果说我们当前的这个页面越热门的话,就应该广告,按道理来讲这个价格应该越高,对吧?正常来讲肯定是这样,我在一进入的这个主页上最显眼的位置做的广告,价格肯定跟那个就是很深层次的一个页面里边的那个边边角角,犄角旮旯,这个肯定是价位不一样,对吧?那所以这里边你不能说我直接拍脑袋说,诶,我这儿就是,呃,就像我们说的这个,呃,电视台做广告啊,都有这个黄金时段,黄金时段肯定贵,对不对?那你说这个黄金时段是你拍脑袋定出来的吗?哎,我就说这个晚上八九点钟就是黄金时段,那这个其实都有数据支撑,对吧?那电台的话,像这个电视台的话,那就是那那应该就是我们所说的这个,呃呃,这这个我们我们电视台统计那个指标叫什么来着,一下子忘记了啊啊对,就是当然就是收视率了,对吧,就是收视率这样一个重要指。
02:00
标,那对于我们这个网站而言,所谓的收视率,那不就是点击量嘛,对吧?哎,你当前的这个网页的访问量,或者说当前的广告会被点击多少次,所以往往情况下,我们也要收集当前这个每个页面上啊广告被点击的次数,那这里面我们还另外给大家考虑一个行为,就是说还根据用户的地理位置可以做一个划分,呃,这个需求主要是说什么呢?啊,就是针对这个不同的广告投放,可能我们有时候会做一个类似于精准营销的这种定位,对吧?那你你想我们在不同的地区,那可能这个用户他的一些消费习惯和一些需求是不一样的啊,如果说是在这个不同的季节啊,就夏天可能还好一点,如果是冬天的话,大家想如果说你是在这个东北对吧,冬天,那肯定你如果去这个这个羽绒服对吧,羽绒服这个页面,那肯定就被浏览的这个很很多对。
03:00
把一些保暖设备被浏览的很多,但是如果说你在海南岛的用户,他可能对这个就不感兴趣,对吧,你在冬天,即使是在冬天,他看羽绒服的这个概率也很小,所以说我们这里边可能在很多场景下啊,要针对具体的不同的情况做细分啊,所以接下来我们是按照用户的地理位置做划分,然后呢,统计不同的省份啊,比方说我们这里面的划分主要就是统计省份,不同的省份里边用户啊,对于这一个广告的点击量,对吧?啊,就是这样的一个统计指标,那接下来我们在代码里边把这个代码也是先实现一下啊,同样还是在当前这个market and analysis下边新建一个object,当前是一个广告的统计啊,所以这里边我叫a dad ad ADD,本来就是广告的意思对吧?啊,然后我们叫这个点击啊click呃。
04:00
我我们管它叫做ad click analysis吧,Analysis,好,先把它放出来,然后接下来,呃,首先我们想到还应该得有数据源,之前我们的那个user behavior里边也没有针对广告的点击,对吧?呃,我们那个里边只有就是当前页面的这个每一个商品啊,页面的一个浏览,所以说你如果要是统计这个对于广告的点击量的话,这个还稍微麻烦一点,所以这里我们是直接给大家准备了一些测试数据放在这儿了,这个我们就不用再去自动生成了,是吧?呃,之前已经讲过这个内容,就不再重复讲了,这里边主要数据就是这个啊,叫做ad click log,诶,我把这个要copy过来,Copy到当前这个resource下边,然后这个数据量本身就比较少了啊,大家看到这个数据量只有只有这个100多条,就是一个测试数据啊,我们看到大概知道是怎么回事,就。
05:00
可以了,那这里边主要有哪些字段呢?我们看一下又是因为这本身是个CSV文件啊,逗号分割相当于也是做过ETL之后的状态,首先大家看到前面有两个这个像ID一样的东西啊,那这应该是什么,什么ID呢?哎,其实跟我们之前那个呃,User behavior里边那个item item ID和user ID差不多对吧?只不过这里边就是前面是一个user ID,后边是一个广告ID对吧?呃,就是,所以这里边其实就大家可以认为跟那个商品一样啊,就只不过把那个广告当成商品就完了嘛,同样的这个行为,然后后面这个不太一样的是什么呢?就都是它的点击行为,后面有了一个当前的地理位置对吧?呃,因为这做过这个ETL啊,所以大家看到直接看到就是省份和这个城市,那这个北京的话呢,当然就是都是北京北京了啊,如果说后面的话,这是广东广州对吧,广东深圳。
06:00
后面还带着一个时间戳啊,这个本身数据还是比较简单的,所以接下来我们先在外边把这个样例类还是定义出来吧,对吧?我们定义输入输出样例类his class啊,这里边我定义一个,呃,我管这个叫做log吧,就广告的这个点击的日志啊,把它提取出来,或者大家叫这个广告点击的用户行为也是一样的,我们这里面关心的user ID长整型,后边是一个广告ID,对吧?A didd长整型,然后后边还有当前的province,这是一个string类型,后面还有当前的city啊,当然我们后面可能这个city没什么用啊。呃,我们都先列到这吧,如果你要想做细分的话,还可以再分,最后还有一个time stepmp长程型,所以这个定义就非常简单,那另外我们输出输出想要什么呢?因为我们是按。
07:00
绕省份去划分的嘛,哎,那所以这个我们就叫做这个ad click count by province,那我们会想到首先还是哪一个窗口,我应该输出一个对吧,我还是按照这个时间,一般情况我们都是统计过去一段时间内的啊,一般不可能说是就是所有的历史数据,数据都拿在一起统计,对吧,这种这种就是统计历史的这种数据还是少一些,你想统计的话,当然也可以,我们这里边一般都是开窗啊,所以这里边还是啊有一个哪个窗口,那我输出一个window and啊,那当前这个window and,我还是想要一个词string类型可视化,那我还是把那个就当当成之前我们这个可视化之后的这个年月日啊,十分秒把这个来输出string类型,然后另外呢,你到底是哪个省的对吧,Province province啊。字符串类型输出,另外还得有一个count长整型,哎,放在这儿就完事了,然后接下来我们要做的事情,其实跟之前也就非常的类似,那直接就是DNA对吧,Stream execution environment,然后get execution environment,记得把这个下划线影视转换引入,然后接下来,哎,同样还是啊时间语义想到,诶大家想到肯定还是能用当前如果要是有时间戳的话,肯定还是要用这个事件时间的,对吧?哎,我们统计的这个含义肯定都是基于事件时间会更好一点,那另外还有就是方便我们做测试啊,直接全局的并行度设成一好,那接下来我们要读取数据了。
08:44
读取,从文件中读取数据,哎,那呃,这里我们还是用这个相对路径的方式给大家定义出来啊,定义一个resource,大家还记得这个方法吧,用get class下边的一个get resource方法,对吧?里边这里边传一个相对路径,我把这个只要copy一下它的这个relative pass放在这儿,然后接下来呢,哎,我们就可以定义了,比方说这里边我先定义一个这个input stream,因为点read the text file对吧,里边我只要传这个resource.get pass就可以了,诶,把这个传进来,然后另外接下来还是同样的过程,是不是要map成样粒类啊,对吧,转换成样力类并呃。
09:45
只提取时间戳和water mark对吧?这都是我们这个常规操作啊,接下来我定义一个,这个我不叫data stream了,因为当前这个本身含义不一样啊,我叫成这个日志log,呃,这个广告点击的这个log啊,日志的stream基于之前的input stream,然后接下来map做转换,那每来的一个data我们定义一个array,对吧,这个流程大家就轻车熟路啊,Split按照什么分割呢?逗号CSV文件最终包装成一个ad click log亮丽类啊,那这里边我们要的就是这个ARRA0本身是一个长整形图,Long ara1也是,前两个都是ID嘛,User ID和aid对吧,这两个转换成长整性,然后后边的字段province和city都是string,这个不用转换了,瑞。
10:45
瑞三最后还有一个瑞四是一个哎长乘形我们的那个时间戳对吧?哎,转换过来就完事啊,接下来还有一步操作是分配时间戳和watermark,诶那这里面到底是升序还是乱序呢?诶那这个我们就得看到底这个数据是什么了,对吧?我们看一下这个数据啊,大家看这个又是呃,这个15116580008060120啊这个测试数据大家看到啊,这个隔一分钟一个对吧,这个这个测试数据都不太密啊,然后这里边后边比较密的话也是1234,大家看这个就是按照顺序来还好的对吧?诶所以这个我们就不用考虑乱续数据的问题了,直接assign assigning time step,大家知道,默认那个延whatmark延迟一毫秒对吧?哎,直接给定这个就完事,然后里边我们要提取时间戳,但是用下划线点time Sam,另外当前的这个时间,诶大家看一下这个应该。
11:45
是一个秒数对吧?因为我们说幺五几打头,你如果是大概最近几年的一个数据的话,那肯定十位数就应该是一个秒对吧,13位的话是一个毫秒,这个就看时间啊,你要是非要表示这个197几年的时间的话啊,那可能这个,呃,确实是这个十位数也是一个,也是一个毫秒数,对吧?但是一般情况我们肯定表示的是最近的时间嘛,这个就是秒,那所以要乘以1000把它提取出来,这是当前的这个转换,然后接下来那当然就是开窗聚合统计对吧?开窗聚合统计好我们定义一个ad count result stream,就基于之前的ad log stream,接下来怎么做呢?既然是按照不同的省份嘛,那当然是key by,当前的province,对吧?啊,然后接下来,诶,那是不是就是time window开窗就可以了。比方。
12:45
说我们还是统计每一天的啊,这样的一个广告的点击量,对吧,我们这里边给一个days,要把time要引入啊window time.time得给一个days one,然后后边比方说我们的这个输出频率还是要很高,还是给一个time.SECOND55秒钟输出一次,这完全可以对吧?啊就是看你具体的需求嘛,那接下来做统计,那统计怎么统计,大家想这又是一个count对不对,这来一个加一,来一个加一嘛,哎,你你还是可以用我们之前诶给大家做的这个预聚合对吧,然后定义一个这个中间聚合的状态,然后再包装后边这个window的信息,输出一个样例类,也可以直接用前面我们给大家做做过的process,对吧?用一个全窗口函数,所有书都拿到,然后直接输出那个size不就完完事吗?结合窗口的信息包装样用类就完事了啊,那这里边我们再再给大家回顾一下之前我们这个aggregate的写法了,对吧,快速的写一下啊。
13:45
那当前我们就可以拗一个比方说这个叫ad countt a j,这是增量聚合函数对吧,但是它拿不到window信息,我们最后输出的这个样例,这类型不是还要window and吗?所以后边再来一个窗口函数,全窗口函数对吧?哎,那这个我定义一个ad count window result,再把它定义出来,大家看这个流程跟之前一模一样对吧?啊,最后我把当前的这个呃,Ad count result做一个result stream做一个print输出,最后不要忘记execute,当前是ad count statistics啊,大家知道statistics对吧,统计的一个job啊,所以最终我们就是实现这两个自定义的函数类了啊,那一个是ad count a,我这里边应该是一个aggreate。
14:45
重审快速过啊,应该大家还记得是吧?然后这里边关键是类型,类型是什么呢?当前输入当然是这个本身的输入样例类了,Ad click log对吧?然后它的输出是什么呢?它的状态是什么呢?我们这里边就保持一个计数器就可以,是不是都是长整型啊,那跟前面那个count a j是一样的啊,所以这里边来长整型放在这,然后接下来是不是又是这四个方法啊,那create accumulateator的时候,哎,那首先零对吧,然后每来一个就加1ACCUMULATOR加一,然后get result时候,是不是还是直接把这个当前的这个技术传回去完事啊,所以这个过程非常简单啊,跟之前一模一样,就是类型变了一下而已。好,然后接下来我们做的这个窗口函数啊,自定义的这个窗口函数ad count window result,它需要去实现的是一个window。
15:45
Window function大家还记得这个必须得是一个scale的treat对吧?不要隐成那个Java里面的那个window function啊,然后它里边的类型同样还是一个input,一个output,一个K,还有一个window类型,那当前的input其实是之前域句和函数的输出,哎,那所以是浪对吧?然后它的输出那就真的是我们的样意类类型了,哎,那是那个ad应该是,诶,我们当时定义的那个样例类类型叫什么来着忘记了啊,太多了是吧?Ad click count byvince啊,Ad click count by province,然后当前的key的类型,我们KBY的时候用了下划线的这种方式,那province是什么类型,这就是什么类型,所以这里边直接给一个string,另外time window写出来放在这儿,写完这里的类型大家检查一下,上面应该不报错了,说明类型。
16:45
匹配了没有问题对吧?啊,那接下来我们看一下要实现的,诶当前要实现的是一个apply方法,这是一个window function嘛,前面我们如果是一个process window function的话,那就应该是一个process方法,对吧?这里边是window function,就是一个apply方法,然后在这个里面大家看就拿到的不是上下文,而是直接是当前的这个window,然后同样有一个inter类型,作为当前的这个所有数据,我们现在所有数据其实就一个那个聚合起来的结果,现在要把它包成一个样例类做输出,那out.collect对吧?哎,现在我们的输出是ad click count count by province这样一个样例类里边的数据呢,首先要一个window end啊,那这个end因为是个string,可能稍微麻烦一点啊,我在前面把它写出来,那这个过程是不是还是我们用那个time STEM给它做一个转换对吧?呃,当前我们那个时间戳从哪里拿呢?window.get and拿到,然后去。
17:45
和一个to string转换,那现在我们直接把这个and放进来,后边还要当前的,还要当前的province,对吧?那province是不是就直接是key啊,对吧?另外还需要当前的那个count值,那count值从哪拿呢?Input里边拿吧,对吧?哎,比方说我直接用had拿出来就完事了,对吧?或者你用那个迭代器,它不是ter类型吗?迭代器点next打到也一样啊,所以这就是我们完整的一个处理的过程,好,那我们快速的运行一下,给大家看看结果。
18:22
大家看到这边已经运行起来输出结果了,大家看到这里边的这个输出结果,它统计的就是什么呢?每隔五秒钟就要输出一次当前的统计结果,然后他统计的呢,就是按照省份对吧,只统计每个省份里边对应的那个广告的点击量啊,当然了,这里边我们没有再区分开,就是具体来讲,大家可能会想到你要做这个市场推广,每一个呃,页面的那个广告统计嘛,那你看还应该有一些其他的一些呃,一些参考的一些指标对吧?比方说页面的ID啊,比方说我根据这个每一个广告,每一个这个ad再去做一个统计,这个可能是细分的一些指标,我们现在相当于就是直接统计了一个总指标,那相当于应该是整个网站的一个点击量,对吧?啊,按照这个不同的地域的一个划分,所以大家看到这就是这样的一个情景啊,我们先做了一个基本实现。
我来说两句