00:00
呃,好了,各位同学,那咱接下来呢,就正式进入到这个ADS层了,呃,首先需要明确的一点是什么啊,ADS层它的职责是什么,还记得吗?ADS层我们称之为是数据应用层,对吧,它里边存放的实际上是我们数仓后续的各项应用所需的那个结果,对不对啊,是这样的啊,所以ADS层呢,实际上我们不存在什么建模这个这个这个呃,相关的知识点对不对,这个其实说白了就是根据人家的需求去决定就行了,它需要什么数据,那咱在这ADS层就给他准备什么数据,那就完事了啊是这样的啊,这个相对比较简单,好,那所以说ADS层我们的重点那就是干啥呢?就是写词啊,好,那现在咱们就正式进入到我们的第一个需求,看一下第一个需求让我们统计的是什么啊,这个需求的标题呢,是各渠道流量统计啊,当然这个标题呢,说实话是一个比较笼统的概念啊,这个所谓的各渠道流量统计,让我们统计的到底是什么呢?来那咱现在一个一个的看一下,呃,来我们看下边的这个需求说明,这是一个表格,每一行代表的就是我们一会儿要统计的一个指标,就是一个数啊好,那现在咱们一个一个来看,先看第一个。
01:10
第一个他我们统计的是什么?是最近一七三十日,这个一七三十日在这儿实际上对应的应该是一个统计周期,对吧?好,那下面呢,是各渠道,这个各渠道渠道对应的是什么呀。应该是这个最终结果的一个力度吧,对不对,OK,那接下来我们继续往下走,那完之后看指标是什么,指标是法克税。反客数,OK,这个反客数,咱们怎么理解什么叫反客数?就是访问咱们这个应用的人数对不对,OK,人人数人数是不是得有一个呃字段用来标识一个人呀,对吧,那咱们用谁去标识呢?用midd去标识一个人,因为咱们要算的是访客嘛,对吧?所以这个大家一定得注意,OK,好,那这个完成之后,我们继续往下看,咱们先来熟悉这个需求啊,后边咱们再考虑怎么做,看第二一个指标,第二个指标是什么呢?最近一七三十日各渠道的绘画平均停留时长,这个怎么理解?
02:05
首先绘画大家都知道这个概念了,对吧?OK,那你想一想,我每个绘画是不是都可能会浏览若干个页面啊,对吧?那每个绘画是不是都会有一个自己的总时长对吧?第一个绘画可能有五分钟,第二绘画呢,可能有三分钟,第三个绘画呢,可能有四分钟,对不对?OK,好,那这三个绘画的平均停留时长是多少?是不是加一起除个三就完事了,这是不是就是四啊对吧?OK,这就是所谓的绘画平均停留时长的概念,OK,那这个指标大家应该已经搞清楚了,对吧?好,那接下来继续往下走,看第三一个,第三一个是什么呢?是绘画平均浏览页面数。这个又怎么理解呢?这个其实也很简单,刚才说了一个绘画是都会浏览若干个页面,对吧?比如说第一个绘画浏览了五个页面,第二绘画呢浏览六个页面,第三绘画呢,浏览了七个页面,那他们的这个所谓的浏览页面数的平均值是不是就是六啊,对吧?就是这个逻辑这块呢,大家稍微的理解一下啊,好了,那这俩指标咱们就都说清楚了,那接下来我们看下一个第三一个是什么呢?是最近一期三十日各渠道的总绘画数,诶这个总会画数是不是就更简单了呀,对吧?那就是一共有多少绘画嘛,对吧?好,那接下来咱继续往下走,最后一个这个可能稍微的有点绕啊,最后一个指标呢,叫做跳出率。
03:22
啊,这个什么叫做跳出率呢?所谓跳出率它显然是一个率,对不对,既然是率,肯定是一个比值对吧?那咱们这谁比上谁呢?哎,我先给大家说一下这个分母啊,分母指的就是总会画数,总会画数作为分母,那分子是谁呢?分组的专业的说法呢,我们应该叫做跳出数,跳出数OK,那什么叫做跳出数呢?OK,跳出数肯定是一个行为的个数,对不对?OK,什么样的行为的个数给大家说一下啊,OK,那所谓的跳出数说的完整一点的话呢,应该叫做跳出绘画的个数,什么叫做跳出绘画呢?跳出绘画是一种类型的绘画啊,什么样的类型?哎,假如说我这儿有一个绘画,对吧?他只浏览了一个页面,然后呢就走了。
04:08
啊,OK,就没有后续的行为了,OK,好,那这样的绘画我们就称之为跳出绘画啊这样的啊,那这样的跳出绘画有多少个,是不是就是那个所谓的跳出数啊,对吧?那它作为分子,然后呢,我们的总绘画数作为分母,然后它俩1:1,我们得到值就是所谓的跳出率啊,其实说白了啊,这个所谓的跳出率它就可以怎么去理解呢?是不是就是可以这么理解,就是只有一个页面的绘画是不是占总绘画的一个比例,就是所谓的跳出率啊,对吧,就这个意思好了,那截止到现在呢,那咱们这几个指标就算是,诶这个讲完了,OK,那讲完之后我们接下来继续往下进行啊,咱们来看一看,就是我们这个建表语句它是什么样的,因为咱们最终一会儿把这个,呃,我们这个需求都做完之后,咱得干啥呢?是得把这个结果写到咱们这个表当中啊,对吧,所以这个表的建表语句咱们必须得熟悉,它的表结构咱必须得熟悉,好那现在呢,我们去熟悉一下它的这个表结构,来CTRLC我给他拿过来。
05:06
拿之后咱们放在这儿啊,好了,那现在我们一起来看一下咱们第一个需求的界面语句,先看一下它的表明,表明叫做ADS,现在是ADS层了,对吧,然后呢,Traffic哎,流量对吧?然后呢,By channel是不是就是ADS层的,诶个这个流量域下边的对吧?各渠道的一个统计对吧?这个咱们稍微再了解一下,那接下来咱继续往下进行,呃,表明不重要,我们重点看它表结构啊,表结构是不是无非就是看它的每行指的是什么,每列指的是什么呀,对吧?好,那下来咱们一起来看一看,咱先看字段这个啊,先看列,OK,这几个列大家看看能不能看明白。我们先看下边这五个吧,这五个应该比较清晰,他们这五个数正好对应的就是啥。正好是不是就对应了我们刚才所所提到的这五个指标啊,对吧?来咱们逐个的过一下啊,首先第一个UV的不就是访问人数吗?对吧?Avg Du SEC是不是就是那个所谓的会平均停留时长了,对吧?啊,当然它的单位要求是什么?要求是秒对不对?这个大家注意一下啊,好,下一个AG page,这其实就是画平均浏览页面数,然后再往下呢,是SV count,就是那个绘画数,然后呢,这个rate bos就是跳的意思,对吧?Rate就是跳出率,OK,好,那这五个字段对应的就是我们刚刚所提到的五个指标,好,他们看完之后我们再往上看,上边这三个字段分别指的是什么呢?
06:25
我们逐个的来看一下,先看这个channel。这个是啥意思,渠道对吧?OK,这个渠道实际上对应的就是啥呀。实际上对应的是不是就是我们刚刚所提到的那个统计力度啊,对吧?因为我们最终要统计的是各渠道的什么反客税,各渠道的这个停留市场,对不对,是各渠道,所以说我们这个表当中是必须得有一个字段用来声明你这个结果是哪个渠道的呀,对吧?诶,是这样的,所以这个渠道咱们的含义必须得搞清楚好,那接下来我们再往上上边这俩字段又是干啥的呢?哎,我们先看这个re内啊,Re在这指的是什么呢?指的就是那个最近的天数,OK,那咱们的统计周期是不是有最近一天,最近七天,最近30啊,对吧?那实际上这个recent它对应的是不是就是我们这个统计周期啊,对吧?那这个值呢,它可能有三种,分别是一七和30,那各自是不是就代表最近一天,最近七天,最近30天呀,对吧?好,那这个搞清楚了,接下来我们再往上看DT它的含义是什么,DT就是一个日期对吧?哎,那就说这个DT在这的作用是什么呀。
07:28
其实很简单,咱们大家要知道啊,就是我们再去算ADS的指标的时候,对吧,我甭管是算最近一期还是30,我都不是只算一天就完事了,我每天是不是都得算一个最近一期30啊,对吧?好,那你今天算出来的这个一期30是截着哪一天的最近一期30呢?咱是不是得用这个DT去标识一下呀,对吧?OK,好,那也就是说实际上这俩字段才能够完整的把这个统计周期是不是给表达出来呀,对吧?是截至这一天的最近一期30天,哎,没问题吧?好了,那这样一来的话,咱这个表字段就算是说完了,那字段说完之后,大家来琢磨琢磨,你说将来这张表每行数据指代的应该是什么呀?
08:10
这可能用语言不太好描述啊,这个应该怎么说呢?这张表一行,它所指代的内容大家可能心里已经很清楚了,但是不知道咋说对吧?啊,可以这么说啊,这张表的每行数据指代的应该是一个统计周期对不对,然后下边的一个,哎,渠道的是不是下列统计指标啊,应该是这样的一个逻辑吧,对吧?可能这么说还是有同学觉得比较抽象啊,那咱这样举一个具体的例子,然后呢,我来看一看大家是不是真正的对这个表结构熟悉了啊,那假定啊,咱现在我这个表啊,假定咱现在就是将来我把这个指标做完了对吧?做完之后呢?嗯,我们整个这个系统当中,咱们一共有五个渠道,比如说一共有五个渠道啊好,那你想一想,我们每天会往这张表里边写入多少行数据。咱们一一共有五个渠道啊,我每天会把这张表里写出多少行数据。
09:03
你要能能答出来,呃,能写多少行,那就说明大家对这个表情够熟悉了几行啊?是不是就是十五行明白了,这个十五行怎么来的,很简单,你想啊,OK,好,我是不是得算一个最近一天的这五个渠道的下列指标,对不对,这是不是会占五行对不对,我是不是同时还要再算一个最近七天的这五五个渠道的列指标,对吧?这是不是有五行,那同理还得有一个最近30天的这五个渠道的各各个指标吧,对吧,是不是一共是十五行啊,对不对?所以这一点大家必须得给他搞清楚好了,那各位同学,那这实际上呢,就是咱们这张表的一个最终的表结构啊,行和列咱都搞清楚了,那理论上呢,我们是不是还得考虑一下这个分区规划呀,对吧?好,那大家来看一看这张表咱有没有分区。你会发现它根本就没分区对吧?OK,为什么ADS的表咱们没有分区呢?咱们之前是不是都有分区对不对?这为啥没分区还对,其实很简单,咱们首先得知道分区的作用是什么。
10:03
什么时候会分区,分区的作用是什么?大家知道分区是为了方便我们将来使用分区字段过滤对不对?OK,你用分区字段过滤是不是这个效,呃,这个效果会更好,对吧?哎,它不用全面扫描,是这样的,好,那我们现在DS层存放的已经是什么了,已经是最终的统计结果了,对吧?那将来我们去查ADS层表的数据的时候呢,我们不会去一天一天的去过滤了,我们会直接把它全部都给它,怎么样呢?是不是给它同步到我们后续的应用当中了,对吧?比如说你后边是不是可能会有报表应用,也可能会有其他的应用,对吧?那谁需要,是不是还得给他同步过去啊,对吧?那到时候呢,是直接就诶统一的同步过去了,是这样的啊,我们不会说,诶根据哪一天呢,再去过滤啊等等等等,是这样的啊OK,那当然呢,这个是一方面的原因,当然这个并不是主要的原因,其实最主要原因是什么呢?啊是这样的,你想一想,如果我现在对这张表进行分区,那我按啥分区呢?我按天分区吗?诶,我要按天分区的话,是不是一天一个,一天一个对吧?那刚才咱们已经分析过了,我每天只会往这张表里是不是写入十几行的数据啊,对吧?十几行或者是几十行对吧?OK,也就是我每一天的数据量都非常的小,每一天数据量都非常小的话,你要放在单独的分区当中,是不是就会对应不同的路径啊,对吧?那不同的一下是就是一个一个的小文件了,对不对?那所以说哎,这样一来的话也不太合适啊,所以说综合考虑呢,那ADS那边了,我们都没有去做分区,哎,这一点要给他搞清楚,好,那其实除了没分区,我们再继续往下看,咱们来看一看它的存储格式,它的存储格式我们这压缩了。
11:34
没压缩,那我们劣势存储了也没有对不对,我们既没压缩也没劣势存储,这个又是为什么呢?其实还是跟刚才差不多的一个原因啊,首先那这儿咱们存放的已经是最终的结果了,对吧?我们不会说诶我只查里边的某个列,然后呢,我再去进行这个相应的统计等等,不会这样去做的啊,是这样的,所以说你这个劣势存储是不是就意义不太大了呀,对吧,这是一个,然后当然还有一个主要的原因是什么呢?OK,那我为什么没有去做压缩呢?为什么没有压,为什么没有压缩呢?之所以没压缩就是因为还是数据量太少对吧?数据量本身就很小,那我就没必要给它进行压缩了,对吧?那所以说在这儿呢,我们既没有分区,也没有列存储,也没有进行压缩,它就是一个普普通通的一个文本文件的表,对吧?诶这个大家稍微的理解一下就行了啊,我们后续所有的表都是这样的,这个大家稍微的理解一下好了,那截止到现在呢,我们第一个需求就算是明确了,那但现在呢,对,就是我们这个需求还有这个不理解的地方了啊,就是说呃,不用考虑怎。
12:34
怎么算啊,大家可能现在还不知道怎么算,这个没关系啊,咱们现在要要明确的是什么,就是你对这个需求是否是,呃,这个了解了,OK,比如说诶,我这个会画平均返回页面数,我还不知道在算什么,还有这样的情况吗?如果有的话,可以举手说一下,有吗?呃,如果没有的话呢,我把视频就先暂时停掉了啊来,我把视频停一下啊好了,各位同学,那接下来呢,我就带着大家呢,把第一个需求咱们一块儿做一下啊好,那我们现在拿到这个需求之后,我们首先需要干什么呢?
13:04
咱得分析这个需求咱们怎么实现对吧?OK,好,那怎么实现,第一步就是干啥呢?你得分析分析这些东西,咱们是不是都得去哪儿取数啊,对吧?哎,咱们得考虑这些东西啊好了,那完之后呢,接下来呢,我我就带着大家系统的从零到一的咱们去分析分析这个需求到底如何实现,那其实啊,就是当我们拿到一个需求的时候呢,诶,我们,呃,确实有的同学可能会无从下手,完了之后这样呢,我其实可以先给大家介绍一个小技巧啊,一个什么样的小技巧,就是你拿到这个需求之后,你先分析分析分析什么东西呢?哪些是我们真正要统计的那个值,哪些对应的是什么,呃,统计周期或者是那个什么统计力度,先把这些东西先给它分析清楚了,OK,好,那各位同学我们一起来看一看,你说这个东西咱们能不能很容易的看出来,应该能够很容易的看出来,对吧?是不是这五个字段是我们要统计的值啊,对吧?因为你要统计的值,它最终是不是肯定是一个什么什么的数啊,对吧?那这些其实我们要统计的值,然后其余的呢。
14:04
这些东西是什么呢?比如说这个这个是什么呀。这个显然是所谓的统计力度,对不对?那上面那个呢,是不是显示统计周期啊,对吧?OK,好,咱们先把这东西先给它区分开好,区分开之后咱们怎么做呢?我们可以先对这个需求做一个简化,怎么简化呢?咱们在做这些需求的时候呢,可以先不去考虑这个统计周期,哎,以及这个统计力度先不去考虑他们,那完了之后呢,把所有的精力都放在我们下边这几个要统计的值上边,哎,OK,好,之后呢,我们把这些算出来,再去考虑我们上边的这个统计周期和统计力度,OK,当然这个可能听起来比较抽象啊,那什么叫做不去考虑上面的这个统计周期、统计力度呢?好,那么到下边的,我算完之后又怎样再把上面的这个统计周期统计力度考虑进来呢?这个具体是怎么一回事呢?我给大家举一个具体的例子啊好,各位同学,那咱们接下来呢,就呃,继续往下进行啊,就是假定咱们现在呢,先不去考虑这个渠道啊,OK,那不去。
15:08
考虑渠道啥意思啊?首先咱得知道这个渠道是什么含义,渠道在这儿呢?它的含义是告诉我们,让我们去分别统计每个渠道的下列指标,大家说是不是这个道理啊,对吧?它在这的作用就是让我们分别统计每个渠道的,对吧?那我要是不考虑它,那就是啥意思呢?但是我现在先不区分渠道,对吧?我先针对于所有的渠道,我是不是去算一个总总的下列指标啊,对吧?咱们先算一个总的,哎,是这样的,好,那我算完之后,那你其实正常情况下是不是会写一个circle出来啊,对吧?写完circle之后,那我怎样把这个渠道考虑进来呢?我怎样把它考虑进来?你想你想啊,我我是不是最开始先没有区分渠道,算了一个所有渠道的是一个统计指标对吧?好,那算完之后我会得到一个circle对吧,那之后我怎样再把这个渠道考虑进来。很简单,你只需要加一个什么就行了,加一格数Y什不就完事了对不对?OK,你的句合逻辑是不是什么的,是不是根本没有没有啥没有啥区别啊,对吧?哎,是这样的啊,你只需要在原有的这个三的基础上再加上一个格入外分组字段就行了,按这分子都按照渠道分组好,那你是不是就能得到各渠道的下列指标来对吧?诶,这样是可以的,然后接下来我们再继续往上走,那这个re是不是刚才咱们所提到那个所谓的统计周期啊,对吧?诶,我们在做的时候呢,也先不去考虑这个统计周期,OK,好,那怎么不考虑它?首先咱们得知道这个re在这儿的含义是什么啊,但是含义呢,是不是让我们分别去统计最近一,最近七,还有最近30的下列指标对吧,好,那我不考虑它,那就啥意思呢。
16:39
我先只算一个最近一天的对不对,OK,那只算一个最近一天,好,我现在是不是会得到一个三号对吧?好,那得到之后我怎样再去考虑最近七最近30呢。咱也考虑这很简单,你想啊,你算最近一天的时候,你是不是需要拿到一天的数据啊,对不对,那我这个要想算最近七天呢,你最近七天跟你最近一天它的区别就是区别就是拿的数据的天数是不一样的,对吧?OK,我就可以怎么的,我是不是可以直接把最近一天的那个30号拿过来,然后呢,把它的过滤数据的那个过滤条件是不是稍微的调整一下就行,对吧,这个拿一天,我这个呢,我拿七天,诶那这样一来,我是不是就能够同时得到最近七天的统计结果了,对吧?最近30咱们是不是也是一样的道理,对吧?好,一七三十都求出来之后,再做一个简单的合并,是不是就能得到咱们最终的结果了呀,对吧?啊,就是说我们拿到这个指标的时候,咱们可以先这样去做啊,先这样制作一个简化,OK好,那接下来呢,咱们就把这个指标呢,先给它做一个简化啊来,那现在呢,我把这个CTRLC拿出来,然后往下走,在这呢,我们给它放上一个哎,简化版简呃化版简化版啊OK好那。
17:49
完之后呢,咱把这个键面语句先拿过来,这个怎么简化呢?就按照我们刚才所说的渠道,我们是不是暂不考虑对吧?Recent呢,我们也暂不考虑,我们也现现在只算一个什么就行,只算一个最近一天的,那就完事了,那也就是我们当前的这个需求已经被简化成了只算什么,只算一个就是最近一天的是不是下列指标就完事了,对吧?好,那接下来咱们就分析分析这个最近一天的下列指标,咱们到底怎么算来吧,咱现在就开始真正的去做这个分析了啊,分析分析吧,怎么着。
18:23
怎么计算一个指标,一个指标的来呗,对吧?OK,那我们现在先看第一个指标,第一个指标让我算的是什么,是访客人数对不对?好,那这个东西怎么算呀?当我们拿到一个具体的指标的时候,首先我们就得明确,OK,它需要用到哪个业务过程对不对,这是我们算所有指标的时候,是不是需要明确的内容啊,对吧?他需要哪个业务过程。你看访客人数,访问人数对不对啊,这个怎么去统计。啊,什么叫访问呀,下面什么叫做访问,只要他浏览我们的页面是不是叫访问了,对不对,OK,那所以说那它对应的过业务过程,那肯定是谁呀,肯定是页面浏览那张实表啊是这个道理吧,OK,好,那完之后大家想一想,你说诶我们去算这个指标的时候,我从页面浏览那张时表,呃,我能不能把这个反馈人数求出来了,肯定是能的,对不对,我找到所有的页面浏览记录,我countting的一下谁就行了,Mid是不是就完事了,对吧?这个能不能求出来,当然是可以的,这个没有任何问题,但是我们,呃,再去做这个真正的需求的时候呢,咱们不要说所有的需求,哎,上来都让他从明细表里取出,这个效率一般情况下是比较低的,对吧,我们应该怎么办呢?我们应该去找一找,就是在DWS层有没有就是你想要的那个业务过程的汇总表,对不对,然后呢,看一看,OK,我从汇总表里能不能把这个值求出来,如果能求出来,我是不是应该用汇总表啊,对吧?好,那接下来咱们就来分析分析啊,好,那我们找一下。
19:55
那DW层有没有,哎,页面浏览的一个汇总表有没有。
20:01
咱们找一下吗?找到DWS,那应该是哪个数据域啊,应该是流量域对吧?流量域是不是就是揣FA对吧?揣是不是有这样的几张对不对,那大来分析分析,你说有没有一张表能够帮我们算出来,算来什么呢?就是你最近一天的访客人数。能不能统计出来,咱们分析分析呗,比如说那我们因为算最近一天是不是找1D的表就行了,对吧?好,那这有一个呃哪去了,正好有一个1D的表,对吧?这是一个什么力度。页面访客力度对不对?OK,好,那这里边咱们能不能统计出来我们今天的访客人数能不能能吧,对不对,这里边一行数据是不是表明这个人在今天访问了一个页面呀,对吧?OK,好,那他是不是访问了对吧?那我是不是也是直接count一下mid就完事了,对不对?OK,那从这儿算是不是要比从明细层算要更好一些,对不对,这个应该是能想明白的啊,接下来我们继续往下走,那下边呢,看看这。这是不是也有一张这个一利表啊,对吧,那这张表是一个什么?是一个绘画力度的一个汇总表,对吧?好,那绘画率这张表能不能帮我们算出来今天的访客数呢。
21:06
其实也能,这是不是也有MIT啊,对吧?OK,好,那完了之后呢,我在这其实也能算出来我们想要的这个结果,这也是可以的啊好了,那完了之后我们这块到底应该用哪张表呢。实际上这时候你就可以比较一下他俩谁的数据量小对不对,谁的数据量越小,我是不是用谁呀,对吧?既然他俩都能出这个指标,那肯定谁数据少我用谁,对吧?就这个逻辑,那数据量的大小由什么去判断呢?是不是根据他们力度判断就行了,对吧?谁的力度越细,谁的呃数据量越多对吧,谁的力度越粗,谁的数据量是就越少啊对吧,那是这样的,在这儿呢,实际上我们正常应该是绘画力度可能要数据量更少一点,那是这样的啊,咱们暂定这个绘画力度表啊好,那接下来我们再回到刚才咱们那个需求上面来,我们找到这个位置,我们看第二一个指标,这个东西咱们怎么算,那绘画平均停留市场这个咋算?嗯,会画平均停留市场这个怎么算怎么算,要正常情况下,那是不是还是得先明确一下,OK,它对应哪个业务过程啊,对吧,咱们哪个业务过程里边有绘画的这个概念。
22:13
是不是那个页面浏览的业务过程里边有绘画的概念,我们自己划分的绘画对吧?OK,好,那完事后琢磨琢磨,那我是不是对应的业务过程就应该是页面浏览对吧?那页面浏览我到底用哪张表呢?明细表我能不能出这个指标明细肯定能出,就这明细怎么出?明细表怎么入?明细表怎么出?呃,明细表咱们找一下明细表啊,找到DW层的这个traffic那张表,找一下DW层,然后是那个配置尾U那张表,对吧?来咱们去找一下是不是就是它对不对,OK,这就是咱们这个明细表,那怎样通过它去计算每个绘画的平均停留时长怎么求。我可以先干啥呀?我能不能先把这一天里边所有的绘画的浏览时长加一起,能不能能吧,我每一注意啊,我每一个页面浏览记录,我后边是不是都有一个during time嘛,对吧?During time是不是这个页面浏览记录的一个停留时长,对吧?诶,我可以先把所有的加一起之后再怎么样,我再除以一下,今天一共有多少个绘画是不是就行了,对吧,今天有多少画,怎么求是不是这有30ID,我们看T的加一,呃30ID是不是就完事了?对,所以这样我能不能求出来咱们想要的这个绘画平行的市场可以没有任何问题,是这样的啊OK,那当然这是明细数据,对吧,咱们是不是应该是就是最后的一个方案,咱们选明细啊对吧,到时候我们应该再想一想,还有没有一点更好的方案,对吧,还是怎么办呢?还是得去我们的是不是DWS层找汇总表啊,对吧,还是找我们刚刚的这个页面浏览的汇总表啊,来去找一下,找到DWS,找到traffic。
23:47
那这块咱们看一看用谁。这儿有一个所谓的绘画力度对不对?这个绘画力度的汇总表,它每行数据对应的是不是一个绘画呀,对吧?OK,好,那我们看一下这张表里它存的什么样的数据啊,OK,你往后走,往后走,大家注意观察,你看我这是不是有一个什么during time,这个during time在这张表里边的含义是什么?是这一个绘画的停留时长吧,对不对?OK,那你想一想,我从这张表里能不能求出来绘画平均停留时长能不能?
24:16
能吧,怎么求直接我我还用sum求和,还用除吗?不用了,对吧?因为我这张表本身每行就是一个绘画,对吧?所以我直接怎么就行,我直接avg这个求平均值是不是就可以了,对吧?对谁求均值,是不是对它求平均值那就完事了,对吧?因为我每行就是一个会画,那这个时间就是一个绘画的时间,对不对?那所以说直接求均值那就搞定了对吧?是不是从这张表里求咱们这个绘画的平行停车时长要更加的方便,而且数据量要更少,对吧?所以在这咱们就用它去求,那就完事了。OK,那接下来咱们继续往下进行,我们再看下边一个指标,这个是每个绘画的平均浏览的页面数,OK,好,那它应该对应哪个业务过程呢?其实还是那个页面浏览对吧,OK,那当然我们从明细表里去统计这个值肯定也能算出来,当然我在这儿呢,我不去用它,那我还是用谁呢。
25:05
我还用这个绘画力度的是不是就行,对吧,为啥?因为会画力度,我后边还有一个统计值是什么,这是什么,是不是那个尾u count呀,对吧?这个尾优count是什么意思呢?是不是就是我这个绘画一共浏览了多少个页面呀,对不对?OK,那所以说在这儿呢,咱们用它是不是也能呃,去算一下我这个每个绘画平均浏览的页位数了,对吧?诶,这个也是可以的,诶这个大家应该是能够想明白了,好了,各同学,那截止到现在呢,那我们这个指标怎么算也就基本上明确了,哎,好,那我们再往下走,下一个是什么?是不是会画数啊对吧?这个绘画顺是不是就求一下一共有多少绘画对不对,这个我们就不再分析了,这个你从明细表肯定也能求,那但是呢,在这咱们应该也从从哪去从哪求,是不是也从那个绘画力度求就行,对吧,因为我一行就是一个绘画,我直接看的星,那我得到的不就是绘画总数嘛,对不对,这个也行啊,接下来继续往下走,跳出率,哎,这个跳出率咱们怎么求?这个可能稍微绕一点啊,什么叫跳出率来着啊,就是只浏览了一个页面的绘画的个数占总绘画数的一个比例,那是不是就是所谓的跳出率啊,对吧?啊,那这个怎么求总绘画数,咱们是不是相当于已经知道怎么求了呀,对吧?那关键是怎样找到只浏览了一个页面的那个绘画的个数。
26:21
这个怎么找到?你想啊,你需要找的是什么?哎,只浏览了一个页面的绘画的个数啊,怎么求啊,对,其实很简单,咱们你思考一下啊,你要想知道只浏览了一个页面的绘画有多少个,那首先咱们得先知道什么呢?你得先知道每个绘画它都浏览了几个页面。大家说是不是这个道理,对吧?你得知道第一个绘画浏览两个,第二画浏览一个,第三画浏览了五个,对吧?然后是不是咱们才从才能从这些绘画里面去找那个浏览了一个页面的绘画有多少个呀,对吧?OK,好,那大家来看一看,我们这张表当中是不是就已经统计出来了,每个绘画浏览了几个页面啊,对吧,他已经统计出来了,既然统计出来,我们是不是直接从这张面里去找这种,诶浏览页面个数唯一的绘画有多少个就完事了,对不对,OK,也就是说我们通过在这张表是不是也能统计出来咱们这个跳出率的指标啊,对吧?那所以说我们综上所述啊,就实际上呢,我们这几个指标实际上都可以出自于谁呢?
27:23
Section配置有这张表都可以出自于它,那所以最终呢,咱们就确定下来了,OK,好,我们就从这张表里取数,然后呢,去统计这五个指标,OK,这其实是咱们一个大体的一个思路的一个分析啊好,那接下来咱们就继续来进行我做先做一个小总结吧,对吧?也就是我们再去做这个adds的需求的时候,咱们大体的思路应该是什么样的呢?你拿到任意一个指标都得先去分析什么,先去分析它需要用到哪个业务过程没问题吧,那之后呢。之后呢,我们怎么办?是不是应该在DWS层先去找一找对不对,找什么?找一找该业务过程所对应的那个实时表啊,是不是那个汇总表啊,对吧?看一看我们从DWS层的汇总表能不能把这个值求出来,如果能求出来,那优先从DWS取,如果DWS层没有能够支撑这个指标的汇总表,那没办法,只能怎么办呢?是不是去DWD层的明细表里去取啊,对吧?你从明细表肯定是能算出来的,诶这个实际上是我们做每一个指标的一个大体的思路啊,行了,那下来咱们继续往下进行,下边我们要做的工作干啥呢?就是写这个S了对吧?好,那现在咱们就开始写了啊,首先我需要先来一个s sed,之后再来一个from from谁DWS嘛,对吧,那之后呢,我们找到一个TF traffic是不是流量域啊,之后我们找到session配置为UED,那在这儿由于我们简化了这个需求了,咱们只需要算最近一天对吧,所以说我们就只过滤一个分就行了啊DG等于2020杠零六杠幺四是不是就完事了,对吧?那接下来呢。
28:53
接下来是不是咱们就可以开始进行相应的统计了呀,对吧?来先看第一个指标,诶访客人数,这个怎么求,这是不是直接来一个看distinct mid,那就搞定了呀,对吧?这个很简单对吧?好,下一个下一个是什么?AV j Du duration second对吧?那在这我们只需要只需要怎么做,只需要是不是来一个avg对吧?对,这张表当中每个绘画的停留时长是不是求个平均值就行了啊,直接求面值啊,OK,那就在这儿呢,我们找到那个during time ED,当然这个during time ED在这张表当中的单位是什么呢?它应该是呃,毫秒的单位,所以在这我们最终要求是什么是秒,所以在这还得还还得给它除一个1000对吧?哎,这个稍微注意一下就行了,好,继续往下走,下面一个是什么吧,是这个,哎,Avg配是count,那在这是不是也是直接给它求个平行值就行了,对吧,我们来一个配置count的1D啊,搞定下一个,下一个是不是用那个所谓的绘画总数来对吧,这个怎么求这个能不能直接count。
29:52
可以吧,为啥,因为这张表咱就是啥力度啊,我就是绘画力度,我一行就是一个绘画,有多少行就是有多少规画嘛,对吧,所以直接看在搞定下一个,诶下一个是什么,是那个所谓的崩斯瑞对吧?哎崩瑞其实咱们需要用到两个值啊,我我先讲完吧,需要用到两个值啊,哪两个值呢。
30:11
一个是绘画总数作为那个分母,还有一个呢,是所谓的跳出数作为分子,对吧,那分母咱这是不是已经有了,这不就是那个绘画总数吗?对吧?来这个CTRLC咱拿过来,我先放在下边啊好,那关键问题是分子咱怎么拿。分子怎么呢?首先咱得知道分子是什么啊,我们这想要的实际上是什么样的,我们找到这个1D这张表,我们想要的实际上是这样的绘画有多少个,对不对?OK,好,那怎样能数出来这样的绘画有多少个呢?啊,其实很简单,你想啊,我在这儿我直接进行count,我相当于得的是总绘画数,对吧?完了之后呢,我现在不是想要总绘画数,我想要的只有这里边的是不是一部分呀,对吧?OK,那我应该怎么做呢?是不是有条件的count呀,对吧?诶,有的我给他呃统计来,有的我不给他统计了,这是不是就有条件的呀,对吧?那怎么去实现这个呢?是不是come的if sum if都行啊,对吧?OK,比如说在这呢,我用一个sum if OK some if怎么写啊,来,我们在这儿往下走,来一个sum,然后里边给它套上一个if if里边应该用谁判断呢?应该用那个配抗的ED判断,对吧?如果它等于一,那我就记个一,否则我就记一个零,诶,那这样一来,咱们得到的就是什么?
31:28
就是这个所谓的跳出数,这相当于做了一个映射对吧,这些我都映射为零了,这个是不是映射成1001,然后呢,我对这个求和得到的值不就是诶配置看的等于一的有多少个嘛,对吧?哎,就是这么个逻辑啊好了,那截止到现在呢,那咱们这个呃跳出率其实基本上就算算出来了,那当然最终这块呢,我需要再给他补上一个呃字段,也就是这个地T统计日期对吧,那这个地T咱这怎么写。这个DT在那怎么写,哎,我能不能直接在这写一个DT字段,这么写行不行?
32:02
行不行?这个肯定不行啊,你直接回车肯定会报错的,对吧,为什么会报错,这是不是还是不不是不知道地T是谁,这儿有地T啊,啊这为什么会报这个错误呢?这个显然是语法它有问题对不对?那说这个语法它的问题根源出现在哪了?为什么这个语法不行。为什么不行啊?这个很简单,大家来想一想啊,你这个抗的,还有你这个抗的芯,或者什么AV这等等,这些都是什么,都是聚合函数对不对?既然都是聚函数,大家来观察一下,我们下边有分组吧,没有分组,没有分组,然后有聚合函数,那你想一想,每个字段它都有几个值,都有一个值吧,你看看是不是就是一个值,这个是不是也是一个值,没问题吧,OK,好,那么是我这个DT呢?DT有几个值,这个就不一定了,对不对?那当然虽然我们这确实有一个什么DT等于2020-024,但是这个过滤条件咱们是不是还可以是其他的呀,对吧?我可能是比如说DT等于0084,或者是00815,也就是DT这是不是可能有多个值啊,对吧?那你想多个值跟我这一个值我能放在一起吗?那显然是不能的,对吧?那所以在这儿你这个语法肯定是过不去的,你要想让它过去怎么办呢?你下边加上一个葛入Y格入外谁DT,那这个语法能过去对不对?那结果他会不会受到影响呢?
33:20
不会,为什么,你想啊,咱们这是不是只有这个DT等于零六杠幺四的数据,对吧?然后呢,我按照DT分组,是不是把所有的数据分到一组了呀,对吧,对不对,也就只有一组,然后所有的数据都在这一组,然后我聚合跟我不分组是不是效果是一样的呀,对吧?是这样,但语法能过去,但是咱们没必要这么做啊,你知道怎么做就行了呢,我把这个去掉,然后我上边呢,我要想写一个这个具体的啊,这个日期我怎么写就行了,我就写一个常量值就完事儿了,我就写一个2020杠零六杠幺四,那这个是不是也能过得去啊,对吧?诶为什么这样就能过得去了呢?道理很简单,因为这些是不是只有一个值,那我这个是不是准确的只有一个值,对不对,那所以说它是能过去的,那接下来呢,咱把这个词给我执行一下啊,走好,那这个结果就出来了,但是咱这个结果呢,它得到之后呢,只有几行数据啊,只有这一行数据,为什么只有这一行呢?很简单,因为我们并没有考虑统计力度,也没有考虑统计。
34:21
周期对不对,那我们得到的是一个针对所有数据的一个总的统计结果,所以是是不是就只有一行啊,没问题吧,OK,那这其实就是咱们这个简化版的这个需求的一个实现思路是这样的啊,OK,好,那这个结果咱们得到之后,到底它对不对呢?这个说实话对不对,每个人他都不一样,对吧,大家不要跟我这儿去比这个数值,每个人可能都不一样啊,是这样的啊,当然我们在这儿呢,也可以大致的去判断一下它是否准确,根据谁判断呢?咱们根据最后一个字段进行判断,这个是一个什么,这是一个所谓的跳出率对不对?OK,这个跳出率呢,实际上我们大概应该是在10%左右。大概应该是在10%左右啊,啊,这个为什么是10%左右呢?来我们看一下哪就行了,看一下我们自己模拟生成那个数据的配置文件就行了啊,那咱们都知道我们这个数据是来自于哪儿呢?是来自于日志的对吧?所以在这我们找到日志的模拟器,进到进到lo,然后我们进到哪呢?进到这里边找到这个pass点杰森,来大家注意观察,就是这个文件它的作用大家还记得是啥吧。
35:23
是不是我们可以自己去配置,咱们自己模拟生成一个日志的页面访问路径啊,对吧?完了之后前面这都是一个一个的pass一个路径,然后后边这儿呢,是不是就是一个一个的比例呀,对吧?OK,那大家注意观察一下,那我这个所谓的路径是不是就是咱们所谓这种跳出的路径啊,对吧?这是不是就是一个绘画,它是不是就只浏览了一个后面对不对,这就是咱们那个所谓的跳出绘画,那完之后呢,它的比例这儿是不是10%,呃,没问题吧,这十啊,当然这个就不准确啊,如果同学没改的话,那这儿正好是10%,如果你前面改了,那就不一定是10%的,咱们这个比例是怎么算的啊,他是用这个去比上这些东西,它的一个和去算的,假如这你要是200,那我这儿就不一定是10%了,对吧?诶他是这么个逻辑,然后当然默认都是100加一起是100,然后这个默认是10%,OK,那完了之后我这儿算出来是多少呢?是百分之六点多对吧,差不多啊,因为咱们这儿不是绝对的准确,它是有一个,呃,这个相对是有一个概率啊,是这样的啊,呃,差不多10%。
36:23
啊,这个大家稍微的理解一下就行了啊,OK,好了,各位同学,那截止到现在呢,那我们第一个需求的注意是简化版就已经完成了,对不对?简化完成之后,那我这个完整版到底应该怎么实现呢?大家课下可以自己考虑一下啊,OK,那先休息会儿吧,我们下节课再继续啊。呃,来各位,那现在呢,我们再来看一下这个完整版的需求到底怎么做,那现在我们把这个简化版的CTRLC给它粘一下,放在这个完整版的这个位置啊好,这个上边是咱那个完整版的键盘语句,这儿呢,再给它补上一个数据来装载,好那现在咱们开始开始去做这个完整版,所以完整版呢,我们还是一点一点考虑,咱先去考虑这个channel channel这个渠道是咱们这个所谓的统计力度,对吧?好,那怎样把统计力度考虑进来的。
37:06
咱们怎怎么考虑来着,是不是理论上我们只需要加上一个什么就行了。拜就行了,对吧,OK,好,那也就是在这儿呢,诶,我们在最后边给它加上一个葛拜谁呢?就葛channel,那这张表当中,咱们本身是不是就有China啊,对吧,那China在这呢,是作为我们这个session的一个,哎属性的相当于是啊,所以在这儿呢,能直接拿到,好,那现在呢,我们把它拿过来之后直接回车,你看我们是不是就已经得到了各渠道的啊,什么东西啊,各渠道的这个这个这个下列指标来对吧?当然这个渠道可能体现不出来,因为我们没选那个字段啊,咱把那个渠道给他选出来,哎,这样是不是看着更清楚一点,对吧?来。诶,这是不是就是各渠道的下列指标咱们就都算出来了,对吧?诶这个其实是比医疗简单的啊,好了,那也就是到现在呢,咱这个所谓的统计力度就考虑进来了,这个非常简单,好,接下来我们往上看,上边是不是还得再去考虑一个recent days,最近一七三十啊对吧?好,那现在他怎么考虑进来呢?咱现在做做这个是不是只有最近一天的对不对,那在这呢,我给它加上一个标注啊,这个杠杠来一个ED对不对,那七天的咱怎么求呢?
38:15
天怎么求,很简单,就是理论上呢,我们七天呢,我们正常可以怎么去做啊,我们可以找那个什么N天的表去算,对不对,但是咱们这个这张表有与之对应的N天的表吗?没有,咱们之前分析过这个session是不是N天的表,有没有没啥区别啊,对吧?没没问题吧,咱们之前分析过啊,所以说我在这儿呢,我要想算最近七天呢,我也得用到这个一类的表,那我拿几个分区呢?是不是拿七个分区就行了,对不对,那所以说你要想算7D的这个这个这个统计结果呢,很简单,你只需要把这个1D的给它复制一份之后呢,只需要把谁改了就行,过滤条件改了是不是就行,对吧?原来你只拿一个分区,那我现在呢,是不是得拿七个分区啊,对吧,也就是DT我得大于等于,里边写上一个data萨当天日期放进去,后边来一个减六,好,那这样一来我得到的结果就是最近七天的,然后呢,下列指标对不对,然后呢,我们现在把这个值给它统计一下。
39:12
来查出来啊,查出来之后你会发现这个值根本就没变,对吧,刚才一天的是什么,现在七天还是什么,这个是为什么啊,给大家解释一下也对,因为我们对于日志这个是来自于日志对吧?日志咱只有一天数据,所以你最近七天是这一天,你最近一天还是这一天,对吧?是一样的,这个理解一下啊好,那接下来继续往下走,那七的要完了之后,那30的是不是跟他差不多呀,对吧?来,咱们拿过来这这老物值要怎么办?把它是不是改成29,那这个30的咱是不是就算出来了对不对?OK,那截止到现在,我们这个最近一七三十日各渠道的这些指标就都算出来了,当然在这儿呢,我们需要给它加上一个标识啊呃,因为我们最终的结果当中是不是有一个recent对吧?那到这这块我算的是,诶各渠道在最近一天的统计值,那这个呢,应该是最近七天的统计值,咱们给它加个七,那这个呢,是最近30的统计值,我给他加一个30,哎,那这样一来咱们就都算完了,哎,当然都算完之后呢,我们需要把这三个紫砂学是不是给它并在一块儿啊,对吧?好,那现在问题来了,咱这并怎么并啊?
40:13
怎么合并啊,怎么合并,你就看最终咱这个表要求的结构是什么样的,对吧?啊,这个表要求结构什么样的,应该是不同的统计周期位于不同的行吧,对不对,OK,没没没问题吧,也就是说我这儿呢,这个一得在不同的行,七得在不同行对不对,那我这怎么拼呢。得union嘛,对不对,就说上下照是不是才能把一级30放在不同的行对不对,所以说得union才行啊,那这样呢,我们最终给它来一个union的操作就行,当然union呢,我们分为union和union,咱这需要去除吗?不需要不需要,那咱就来一个union是不就行了,对吧?那OK,那在这边的CTRLC拿过来,下边的这儿咱也给它,给它进行一个union操作,那就完事了,好了,那截止到现在呢,诶我们最近一期三十日对不对,然后呢,各渠道的是不是下列指标咱们就都算出来了呀,对吧?那现在呢,我们把这个给查询一下,看一下最终的结果怎么样啊好了,那现在呢,一诶放在一块呢,七是不是放在一块,然后30是不是也在一块了,对吧?好了,那咱们这个指标就算是做完了,OK,这就是我们这个完整版的这个需求的一个实现思路啊,OK,好,那当然这个结果虽然咱们求出来了,但是呢,大家应该能够感觉出来,就是这么去写这个circle,是不是感觉有点就是不太好啊,对吧,就是不太聪明对不对,看起来对不对,什么意思,你想啊,你这里边实际上相当于你重复的编写了大量的这个计算。
41:32
逻辑对不对?你看啊,实际上我们这三个子查询,那他们的这个,呃,计算逻辑是不是基本上都是一致的呀,对吧,那完之后呢,我是不是写了三遍呀,对吧?那玩意假如说我们将来这个统计周期我更多了,比如说我需要去算一下最近一天的,最近三天的,最近五天七十一十等等等,你需要算很多,那你这块是不是得写一大串啊,对吧?那这个显然是不太好的,而且这里边可能会有一个问题,什么问题呢?啊,就是假如说我有一个计算逻辑我写错了,你要写错了的话,你是不是每一个自查询都得改一下,对吧?因为你相同的逻辑写了好多遍嘛,对吧?这个其实跟咱们写代码一样,对吧?你写代码的时候,假如说我有一段代码,对吧,有一段逻辑对不对,我这个重复的编写了好几遍,那这个通常咱们会怎么做呢?我通常我是不是可能会想到OK,我可以去把这些相同的逻辑抽取出来,我怎么样呢?我写一个方法对吧,完了之后让他去调用这个方法是不就完事了,对吧?也就是说尽量保障相同的逻辑,是不是咱们只写一遍呀,对不对,那写三也是一样的道理,对不对,我这儿相同逻辑写的好。
42:32
图片咱们通常也不这么做啊好,那现在问题来了,这个circle咱们能不能稍微的优化一下。对不对,我能不能稍微的优化一下。哎,其实答案是可以的,对吧,那怎么优化呢?那现在我们分析分析啊,来我把视频先停一下啊来吧各位,那接下来呢,我们来分析分析,就是这个circle考咱们能不能给它优化一下,呃,来这个呢,我给它标注一下这个咱们写一个方案一,怎么切不过来呢?方哎,然后按一啊好,那现在我们来看一看它的方案二,我们应该怎么实现啊,来一个方案二。
43:07
来吧各位,先来分析分析,怎样能把上面这一大串所给他优化一下。就是咱们优化的大体的思路是什么啊,就是最终我们应该实现这样的一个目标,就是说相同的计算逻辑我只写一遍对不对,这是我们优化的一个最终目标,对吧?啊,那怎样能实现这个效果呢?哎,怎样能实现这个九,咱们得先分析分析啊,分析什么呢?就是看一看我们这儿这几个子查询对不对,那他们各自有什么样的特点,或者咱们之间呢,有什么样的联系对不对,咱们得分析分析啊,来分析分析这仨子查询,他们有什么样的联系,他们有没有什么相同点。有没有相同点,有相同点,他们的相同点就是聚合逻辑完全一样对不对?你看啊,这三子战权是不是都是按照China进行分组,没问题吧?OK,那都是对这几个字段是不是进行聚合呀,对吧?你会发现这几个函数,这几个circle,那他们的这几个聚合函数是完全一样的,是一模一样,对吧?OK,这是它们的相同点,好,那它们的不同点是什么呢?就是他们的区别是什么呢?
44:11
区别就是他们聚合的数据是不一样的,对吧?OK,那第一个子查询,它聚合的是这张表当中的是不是这一个分区啊,对不对?OK,那第二一个呢,它聚合的是这张表当中的七个分区,而这个呢,它聚合的是这张表当中的30个分区,也就是他们聚合的数据是不一样的,对吧?就是咱们总结一下啊,就是这三个子查询,他们实际上是在干什么啊,实际上是在对不同的三份数据进行相同的聚合的操作。应该是这样的一个逻辑,对吧?好了,那现在问题来了,我们能不能就是说OK,我通过一个circle对不对,对这不同的三份数据进行一个相同的聚合操作。能不能,能不能把他们仨并到一个S里边,咱们去和逻辑直写一遍,能不能实现。
45:03
啊OK啊,再来明确一下咱们现在的任务啊,我们现在任务要干啥,是要对三份不同的数据是不是进行一个相同的聚合呀,对吧?哎,能不能去实现这个,谁能帮我们去做这件事儿。哪个语法能帮我做这件事啊,对不同的数据进行相同的聚合,哪个语法能做这个事儿?搁是不就行。对不对,来咱们回忆一下,就是葛入外是不是他通常会带着聚函数分组聚合嘛,对不对,那分组聚合它底层是怎么做的呀,它最终实现的效果是怎么做的呀,它是这么做的呀,OK,假如说我这儿呢,有一堆数据。对吧,那你分组的时候是不是得指定一个分组字段对不对,那他会把那个分组字段相同的数据是不是分到一组里边去啊,对吧?这有一组,这有一组,这儿也有一组,然后分组完之后,我们上边写字的是不是得有聚合对不对?OK,那我们在分组后边写的聚合,实际上这套聚合逻辑是会应用到什么上面的,应用到每一组上面了吧?没,没问题吧,OK,那这不就是在对对不同的数据对吧,进行一个相同的聚合吗?分组聚合其实就是在不同的数据再对不同的数据进相同的聚合,OK,那咱这要实现的效果就是不是就是对不同的数据进行相同的聚合,所以在这儿咱是不是就可以借助一下这个分组的这个这个语法呀,对吧?借助一下分组的这个思想,好,那接下来咱们来分析分析,我们这怎样能使用分组去优化咱们这个circle口呢?来咱们琢磨琢磨啊,OK,那你要是想对这三部分不同的数据进行分组集合,首先咱得先干啥呢?
46:36
咱们就得先拿到这样的三份数据吧,对吧?OK,我们需要先拿到一份数据,OK,它里边对应的应该是谁?应该是第一个次查询,对吧?里边应该只有是不是这张表的一个分区啊,对吧?OK,咱们先拿到这样的一份数据,然后呢,你是不是还得有第二份数据,它应该有几个分区呢?诶,应该有七个分区对不对?然后呢,第三份数据的应该有30个分区才行,咱是不是得先拿到这样的数据啊,对吧?而且你这个数据他们各自还得有一个自己的标识。
47:05
为什么得有一个标识呢?因为得分组嘛,对不对,OK,你得保证OK,我这个一这一份儿得有一个自己的标识,对不对,我七这一份呢,是不是也有一个自己的标识啊,对吧?30这一份呢,每行上面是不是也得有一个自己的标识,对,好,那假定我们现在拿到了这样一份数据了啊,拿到之后接下来咱就可以怎么做。我就可以直接分组了吧,对不对?按谁分组,咱是不是就按照这个标识分组就行了,对不对,OK1,哎,那我是不是所有的这个最近一天的分区都分到一组里边去了,对吧?那七天的分区呢,是不是都分到七这一组了,对不对?30的分区呢?是不是就分到30这一组了,对吧?那分到一组之后,我们是不是直接再对他们进行一个统一的这样的一个聚合就完事了,那就会把这个聚合逻辑是不是应用到这三组上面,咱们就能同时得到我们这个一七三十的统计结果了,大家说是不是这个道理啊,哎,是这样的啊,OK,好,那咱接下来就来琢磨琢磨这块到底怎么去实现分组,好说,其实这里边的难点是什么呢?难点是如何能得到这样的三份数据吧。
48:10
对不对,如何能得到这样的数据,怎样能同时得到一七三十的这个30数据,而且同时还得保证他们得有各自的一个标识,对不对,怎样能实现这个效果。怎样能实现这个效果呢?说实话这个不太好想啊,不太好想啊,这里边怎么做的呢?我告诉大家我是怎么做的啊,我这儿用了一个就是UDTF函数,Exp函数来,我是用了它去做的啊OK,我怎么去做的呢?哎,我先给大家明确一下这个思路,然后呢,我再给大家去解释,呃,然后再给大家去写这个S啊,我是这么做的,首先我先拿到这张表。我先拿了这张表,然后呢,我在它后边,我直接就跟上一个什么呢?跟上一个explode OK,那explode它是不是会把数据由少变多呀,对吧?OK,好,那explo里边是不是得给他传数组,对不对,那我给我给他传一个什么样的数组呢?我给他传一个固定的数组。
49:04
就传一个固定的数,这个数组呢,它里边有几个元素呢?就是三个元素,这三个元素分别就是什么?一七三十,好,那你想一想,我这样给它进行了一个炸裂之后,那我这两本的数据会变成什么样啊,它是不是会变成原来的三倍啊,相当于是没问题吧,而且有一份里边它会带带有一个什么呢?是不是带带会带有一个一的这样的字段啊对吧?大家都知道我这个就是UDTF函数,后边我是不是会炸出来一个字段啊对吧?这个字段是不是位于我们这个炸完之后的虚表当中,没问题吧?OK,那有一份全是一,那另一份呢,是不是就全是七啊对吧?OK,那还有一份呢,是不是应该就是全是30,哎,大家应该能想明白啊对不对,OK,我就得到了一份这样的数据了,但是这三份数据他们的行数现在是一模一样的,对不对?那我这想要的效果是什么呢?第一份我只能留下什么。一个分区对不对?那第二份呢,我需要留下七个分区,第三份呢,我是不是需要留下最近30个分区才行啊,对吧?OK,好,那也就是说我需要再对我刚才炸裂之后的数据是不是做一个简单的过滤啊,对吧?做完过滤之后,我就让第一份只留一个分区,这个留七个,这个留30,好,那如果能得到这样的一份数据,我剩下的工作是不是就简单了,只需要做一个分组聚合就OK了,对吧?诶,这是我这儿的一个思路啊,好了,那思路咱们整完之后,我们来看一看,就是这个UDTF到底怎么写,对吧?那炸完之后我这个过滤条件又应该怎么写?来,咱一起来把这个circle实现一下啊,OK,那现在呢,我们继续往下走,呃,咱们这样吧,我们先基于这个简化版的这个需求去做一下啊来CTRLC咱给它拿过来,来之后呢,放在这儿啊,OK,那这个我们怎么去做的呢?首先先完成第一步就是炸裂的一个操作啊OK,炸裂是不是通常是写在我们这个,呃,From这个后边来对吧,然后后边我们就跟上一个let,诶,View viw后边呢跟上ES。
50:57
Ode explode里边咱放上谁呢?放上一个a ray和RA里边注意观察啊,我这要放的是一个什么呢?是一个固定长度的数组,对吧?OK,这个数组有几个元素,有一个,诶有有三个元素,分别是一七三十,这个咱们怎么理解啊,因为我现在是不是就是要把这个数据是不是炸成三份啊,对吧?那所以说我这儿相当于是给每一行后边是不是都手动的加上一个固定长度为三的数组啊,对吧?那这样一来你对它一炸是不是一,也就是每一行都会变成三行啊对不对,应该是这样的一个逻辑,这块儿大家要搞清楚好了,那这个加完之后,那我们的数据就已经由原来的一份变成了相同的三份了,对吧?那后边呢,我们给它来一个ttm后边加一个啥呢?加一个边名as,我们就叫做re,然后呢,Days re,好了,各位同学啊,那现在这个udf函数咱们已经写完了,写完之后咱们前面讲过就是我select from对不对?现在from的还是这个圆。
51:57
表吗?不是原表了,而是这一大串,这是一个整体,对吧?他们是一个虚拟表,这个虚拟表较原来相比发生了什么样的变化呢?
52:07
行,它会发生变化,列是不是也会发生变化,对吧?行,那由原来的是不是一行都变成了三行啊对吧?OK,好,一行都变成三行了,那列呢,是不是会多一个列对不对,多一个列就是谁就是re,对吧?啊,这是现在在这三份数据当中呢,是不是分别是一七还有30了对吧?好,也就是我现在呢,这个数据已经由原来的一份变成了三份了,然后是不是也已经有那个标识一,然后有这个标识七,有这个标识30了呀,对吧?好,那接下来咱需要干啥呢?咱得过滤一下吧,对不对,我得保证第一个只留一个分区,第二个只留七个分区,第三个呢,只留30个分区,咱是不是得过滤一下对吧?好,现在问题来了,怎么去写这个过滤条件。怎么去写这个过滤呢?怎么写这个过滤?这个说实话也不太好想啊,大家琢磨看能不能想出来啊,怎么写过滤能保证第一个只留一个分区对不对?第二个呢留下七个,第三个呢,留下30个。
53:08
怎写,怎样写这个管理条件能实现这个效果。啊,怎样能实现这个效果。哎,其实在这咱可以这么写啊,我先写着,然后咱们来分析分析它对不对啊,哎,我这是这么写的,我直接来了一个什么呢?DT大于等于。大于等于多少呢?啊,应该这么写,来一个data sub data里边咱怎么写呢?应该是先把当天日期给它放进去,当天是14啊完之后后边我怎么写呢?写上一个recent days,再减一个一。啊,是这样的啊,OK,为什么这么去写啊,OK,那咱们现在来分析分析,咱这为什么这么去做啊,来,首先各位同学我们来看一下。咱们来看一下啊呃,注意观察这个位置,刚才我们说了,到这一步我们已经将这张表的数据是不是扩张为三倍了呀,对吧,那三倍完之后呢,它后边会有一个字段,就是咱们提到那个re days对吧,这个全是一,这个呢全是七,这个呢全是30,没问题吧?好,那你看一看啊,我把这个过滤条件应用到我们这些数据当中的时候,它会有一个什么样的效果啊,那对于就是re等于一的这份数据啊,OK,你看你这个过滤条件,它其实最终会转化成什么呢?是不是会转化成re减一,这个在这一份里边是不是全是一,对吧,全是一的话,那我这是就是相当一减一,不加不减啊对吧,也就是实际上对于这份数据而言,咱们这个过滤条件实际是什么,实就是DT大于等于零六杠幺四对不对,那你大于等于0624是不是只有这一天。
54:46
对不对?那这儿是不是就只把14号的数据给留下来了呀,对不对,13之前的是不是全部被过滤掉了,对不对,OK,它只留下一个分据,好,那接着再往下走,那对于瑞森的date等于七的这一份数据而言,那你是不是就可以把瑞森等于七是不是带进来了,对吧?带来之后相对变成什么了?变成瑞森是不是七七也等于六啊对吧?是不是这个过滤条件就变成了DT大于等于data s当前日期,然后减六啊对吧?OK,那这样是不是就会把最近七天的这个分区留下来,其余的全部被过滤掉了,对吧?好,那在这儿呢,它就会剩下七个分区域,好,那同样的道理,对于这一部分数据而言呢,这个re内等于30,这变成减29了,对吧?那你是不是就相当于留下了最近30个分局了,对不对,OK,好,那这样一来我们这三份数据就已经拿到了。
55:34
啊,就已经拿到了啊好,拿到之后咱们接下来大家说我们可以干啥,接下来就容易了,我们只需要按照谁分组就行了,只需要按照瑞森的代词这个字段是不是进行分组,然后就能得到我最终的结果了呀,对吧?好,那现在呢,咱们去试一下啊,我只需要在下边再加上一个葛如拜,葛如拜谁呢?葛如拜re this没问题吧?好,那当然呢,我们上面是不是需要把这个re给它选出来对吧?来一个re好了,那这样一来我们就同时得到了最近一期三十日的这个统计结果了啊当然呢,呃,由于我们这儿用的是刚才那个简化版的circle啊,简化版我们这还没有考虑到渠道啊,对吧?那所以在这儿我们只有三行数据,好,那现在呢,我们再把渠道考虑进来,渠道怎么考虑来着,是不是只需要给它加上一个分组就行了,对吧,我们这儿本身是不是就已经有分组了,对吧?所以说只需要给它添加一个分组字段就行了,在这儿呢,我们加上一个channel,上面呢,咱把也把这个channel给它选出来,来我们这儿来一个channel好了,那现在我直接回车走。
56:34
好,各位同学,你看现在咱们得到的结果是不是就是最完整的这个一期三十日各渠道的下列指标量,对吧?是这样的,OK,好,那这个结果跟我们刚刚你这么分开去写,这个得到的结果是一模一样的,哎,这个大家要稍微注意一下,那当然呢,我们这么去写的话,这个是不是看起来要简洁多了呀,对吧,我我一个30我就同时把咱们这个三份数据都给它求出来了啊,而且这个聚合逻辑呢,我们也没有重复的去书写啊,这个大家一定要理解一下啊,当然说实话,这种方案呢,咱们理解起来可能要稍微的难一些啊,对不对啊,但是呢,呃,这个就是代码看起来要更简洁啊,但其实从性能上去考虑啊,这种方案的性能跟上边这种方案的性能其实没有太大的区别,对不对,因为他们处理的数据是不是还是一样多呀,对吧,这个是一个分区,这个七个分区,这个30个分区,那咱们这儿呢,我是不是仍然是处理了一七三十个分区啊,对吧?诶只只是这个三数看起来更简洁啊,但是呢,这个计算。
57:35
性能其实差不了多少,那所以这两种方案呢,大家呢,你就呃喜欢用哪种,那咱们就用哪种就完事了啊,这个你要觉得第一种方案更好理解,可以用第一种啊,这个没有任何问题,这个大家理解一下行了啊行了,那第二种方案咱们也就算是完成了,来视频我给他停一下啊。啊,好了各位啊,那刚才呢,我们已经通过两种方案把这个需求所需要的最终结果都算出来了,那最后呢,咱是不是需要给他补上一个音三的呀,对吧?好,那现在我们以方案二为例,看一看这个insert怎么写啊,正常的话是不是就是ins inside的,咱们之前都写的啥,是不是都写的right呀,对吧,后边是不是写table table后边是不是加上咱这个表名就行了,对吧?As traffic sta by in by channel对吧?是不是正常这么写,然后之前咱是后边还有part这样对吧?那现在咱们还需要写了,不需要了,因为咱这张表是不是根本就没有去做这个分区啊,对不对?所以理论上咱这么写就完事了,诶那你想一想,这么去写这个circle,考它会不会出啥问题?
58:30
肯定会呀,对不对,由于这张表咱没分区对吧,所以说我每天ins色的all right,咱覆盖的是不是都是这个全表,对不对,也就是说这张表将来它每天里边都只会存什么呀,都只会存当天的这个最新的数据,原来的是不是都被覆盖掉了呀,对吧?那所以这个显示是不太合适的,哎,那咱这怎样去做能够去解决这个问题呢?怎样做呀,那那用into呗,对吧,那很直很直接对吧,我们用烟into,用烟into是不是不会出现刚才那个问题,但是你用烟into说实话还会引来其他的问题啊,会引来哪些问题呢?首先第一个对,就是你要用烟into,那我这个任务它就不密等了,啥意思呢?假如我这个任务我重复的执行一遍,注意是重复的执行一遍啊,那OK,我这个数据是不会被重复的写入到这张表里,对吧?那也就是会有相同的数据,数据会重复,这是一个问题,OK,那当然除了这个问题之外,还会有另外一个问题,什么问题呢?
59:27
它会有小文件的问题,为什么会有小文件呢?咱们来思考一下啊,各位同学,咱们大家都知道inser的into是所谓的追加,对吧?那这个追加是针对于谁而言的追加呢?对,是针对于这张表而言的追加,但是它对于我们这张表在HDFL的路径而言,它是对文件进行追加吗?并不是你每次ins inside的input它都会往这里边写入新的文件,对吧?OK,那你想一想,我们前面提到过这张表,我们每天的计算结果是不是也就十几条20几条啊,对吧?那完之后你每件都新生成一个文件,每天都新成一个文件,这是不是都是小文件啊,对吧?那时间长了,那这个就不太合适了,因为ADS我们会有很多的表,对吧?那每天都会往里边印字,那你每天都有小文件,那这个显然时间长了就不好了,诶那所以说用into这也不行。
60:19
OK,那这这有点麻烦呢,Right不行,音度还不行,那怎么办,那应该怎么办呢?就是咱怎样做啊,就是能解决第一个就是我们这儿,呃,重复执行的一个问题,对不对,那就是不是重复执行,就是这个数据重复的一个问题,怎样做能解决数据重复的问题,那再有一个呢,怎样做我们能解决小文件的问题,对不对,咱得把这个问题给他解决。啊,对,咱有同学已经想到这个方案了啊,我可以怎么做呢?我可以先把这张表当中原来的数据先给它查出来,对吧?查出来之后呢,再把它跟我们今天的这个计算结果进行一个合并,对吧?那合并之后再把这个最终的结果给它insert什么回去all right回去,诶那这样一来是不是就能够解决我们这当前所有的问题了,对吧?它怎么解决的啊,我先写上,然后呢,我再给大家解释啊,那首先我们需要把这个改成insert,是不是overight呀,对吧?然后我们需要先把原来的数据哎给它查出来对不对?Select星from咱们这个ADS层的这张表ADSOK,好,那下边呢,是不是在跟我们今天的数据进行一个合并啊对吧?这个合并咱们这用的是什么?注意观察。我用的是。
61:33
由年而不是优年奥对吧?OK,我这为什么这么做啊,咱们来分析分析,来,我们看一看你这么写是如何解决我们刚刚提到的那些问题的,首先呢,我们刚才提到第一个问题是什么来着?是这个数据重复的一个问题,对不对,你看啊,咱咱们当前这么去写,我们这个circle,如果重复执行,这里边还会不会出现重复数据。理论上应该不会了,对吧?为什么咱们来模拟一下这个场景啊,假如说我现在这张表呢,它是一个空的,第一天啥数据都没有对吧?好,那现在呢,我执行了这样的一个circle,那这个circle的执行结果是什么呢?首先select front这张表里边它都没有是空的,对吧?那完之后呢,下边是不是就是咱们今天的总计结果对不对?空的跟今天的结果合并在一起,然后呢,写到这张表里,好,那现在这张表里是不是就已经有一份今天的结果了,对不对?好,那假定我现在把这个circle重复的执行了一遍,好,那重复执行一遍之后,那是怎么做呢?首先是不是还是先从这张表里把这个数据查出来,注意现在是不是已经有一份今天的结果了,好,查出来了,OK,那下面呢,是不是又是今天的这个结果呀,对不对,诶然后之后呢,它俩是一样的,应该对吧?然后呢,诶我这用的是union union是不是会对相同的结果进行去重啊对吧?好,去重完之后是不是只剩下一份了,对吧?那一份完之后呢,我在inser的什么回去over right回去是不是就用一份把原来那一份又给覆盖了呀,对吧,相当于我这里边数据重复了吗?没。
62:55
重复诶这是不是就是我们想要的一个效果,所以说首先重复执行带来的数据重复的问题我们就解决了,也就是这个任务呢,它应该就是密等的了,对吧,这个没问题,好,那接下来我们再继续往下进行,那他这怎样去解决那个小文件问题的呢?
63:10
他怎样解决小文件呀,你想法咱们现在每天是不是都是insert or right对吧?也就是你每天都会把表下边原有的文件给它覆盖掉,对不对,也就是说每天我这个表下边到底有几个文件呢?是不是你就看这个三个执行完之后输出几个文件,它这个表下边就是几个文件呀,是这个道理吧,因为每天都会把原来的覆盖掉吧,对吧?OK,那我这个circle克它原来将来它会有几个文件,这个取决于什么呢?实际上是取决于你这个具体的计算任务吧,对吧?假如说咱们底层是map reduce,对吧?我这个map reduce最终输出几个文件由什么决定,是不是有那个reduce个数决定啊,对吧?假如说我有一个reduce,那就是一个文件,假有俩reduce,那就是俩文件,对吧,但是甭管他几个,他肯定不会说每天都往里边新增几个,对不对,没没问题吧,所以说这个小文件问题,咱们也就相当于解决了,诶好了,那截止到现在,那这个三克咱们这么写,理论上就是完美的了。
64:04
理论上是完美的,但实际呢,不是完美的,实际你在真正的执行的时候,你会发现它有问题,它有什么问题呢?就是我们那个去虫其实并不会达到我们想要的效果,也就是这个UN呢,它去虫并没有达到咱们想要的效果,为什么在这儿它不会达到咱们想要的效果,因为你这么写,它确实存在问题。哪存在问题啊,各位同学。类型,咱们大家很容易会忽略到这个类型数据的类型,为什么呢?大家来看一看啊,咱们这张表看一下,我们点一下。点过去这张表,咱们以一个字段为例吧,咱以它为例对,大家注意观察,那我这有一个是不是有一个所谓的跳出率对吧?跳出率咱是什么类型呢?是DEC类型,好,那DEC类型这个值咱们算是怎么算的呢?往下看,我们是不是用一个值比上了一个值啊,对吧?OK,那在have当中,一个值比一个值,它默认的类型是什么类型?其实是double类型,它默认是double类型,OK,好,那玩意儿,也就是说你计算出来的类型跟这个最终的表当中这个目标类型它其实是不一致的,对吧?OK,好,不一致这块可能会出什么问题呢?来咱们分析分析啊,那假如说我现在呢,这张表它是一个空表,现在啥都没有对不对?好,那完之后呢,我执行了一半这个circle,那这个circle执行完之后呢,它是不是会把今天的结果写到这里边来啊,对吧?然后大家要注意,在have当中,我们再往一张表in算的数据的时候呢,它会强制的把你这个结果转换成目标类型,OK,那这儿咱们刚才说了,我直接算出来是不是double类型啊,对吧?但是呢,他再把这个数据写到们这个最终的目标表的时候,它是不是会自动的给你进行强转呀,对吧?OK,好,它会把这个转成DASIM类型,也就是说最终存到这张表下边的数据是DA Mo类型的,这个没有问题,对吧?好,这是我们第一次执行这个circle,好,那现在呢,我们又重复了执行了一遍这个circle啊重复执行好,那么绕后他是怎么做的呢?
65:57
他是不是会先把这张表当中已存在的数据给查出来呀,对吧?诶,这就是我们今天的一份统计结果,查出来了,好弄完之后呢,是不是会把下边这个是不是又算了一份今天的总结果对不对,OK,好又给他拿出来了,理论上按照我们刚才所分析,OK这两部分数据是不是应该是一模一样的,它会进行去重啊,对吧,但实际上它一样的。
66:18
它不一样,它不一样啊,为什么不一样呢?因为你从表里查来的这个数据,这个字段我是DEC类型,而我下边新算出来类型是什么呢?是double类型,OK,好,那这俩类型不一样,害也会认为它不是同一条数据,是这样的啊,也就是它不会帮你驱虫的,必须得完全一样,包括数值,包括数据类型都一样,它才会去重,好了,那也是在这儿的,它并不会去做去除,不去重,那就会怎么办呢?是不是会把这两份数据insert or right回这张表里,对吧?你要知道在往表里边insert or right的时候会怎么做呢?OK,原来的DEC是不还是DEC,那你现在新查出来这个double是不是又会转成death猫对不对?所以说你就会发现这张表里最终会出现两份一模一样的数据啊,是这样的,OK,好,那这这样一来的话,是不是这个去重就相当于失效了呀,对吧?哎,也就是这么写,还不是最完整的答案好,最完整的应该怎么写呢?大家说我这个怎样写能避免这个问题。
67:18
咱们提前给它转好是不是就行,对不对,我把这个三前面对吧?我给它加上一个cost对吧?我给它cost成什么呢?我们这个表的目标类型是不是就完事了,对吧?这样一来是不是就不会再出这个问题吧,对吧?这个大家稍微的理解一下啊,好了,那这个circlel我就不再手写了啊,咱们拿一下文档当中这个最终的答案来拿过来,CTRLC我给它放在这个位置,嗯,好了,那你看文档当中是不是每一个统计值它都做了强转了,对吧?你都做强转这个肯定不会出问题的,当然前面这些没转,前面这些本身就是字符串类型,对吧?这个肯定是没问题的,哎,这个大家稍微理解一下啊,行了,那截止到现在我们第一个需求才算是写完了,那我们后边所有的ADS层的指标呢,咱们都用这种方式往里边insert的数据都是先查出来,再跟今天的合并,最终呢,再insert right啊行了,完成之后视频我给他停一下。
我来说两句