00:00
呃,先咱们先来整体看一下咱这个所有的需求吧,整体看一下啊,在这个第七章,呃,ADS层我们也分了这样的几个小节啊啊呃,其实也是分了几个主题吧啊,什么有设备主题啊,这个会员主题,商品主题啊,还有什么营销主题,当然这个所谓的主题呢,跟咱们DWSCWT那个主题呢,也不完全一样,DWSCWT那个主题是不是直接对标咱们的维度维度啊对吧?对接维度表,一个维度一个主题,一个维度一个主题,那这边呢,我们就是按照这个需求的内容啊,大致给它分了一下啊,那这个都是跟设备相关的,这是跟会员相关的,这是跟哎商品相关的,那其实这个呃,分不分倒无所谓了啊,这个很简单啊,那接下来我们看一下a Di层啊,咱们第一小节啊,这儿有一个关于这个建表的一个说明啊a Di层啊,咱们不涉及到建模啊,建表呢,就根据具体需求而定。啊,因为这个,呃,咱们前边DWDDWSDWT这三层,咱们是不是每一层有自己的这个建模的一个思路啊,对吧,那到了ADS层咱们就没有了,同是你需求要求找什么字段,我就给你,给你选什么字段就完事了啊所以这个不用考虑建什么表,也不用考虑表当中的字段啊啊,那这个咱们搞清学型啊,那接下来呢,我们看第一个啊,就是设备主题,其实这个叫设备主题,呃,其实其实就是什么,就是访客主题,这里边我们所统计的都是一些跟流量相关的指标。
01:25
啊,那所以说这个7.2这个呃一小节里边我们所有的需求,呃,咱们默认都以谁作为用户的唯一标识呢,都以设备ID。啊,都有设备ID啊,你看咱们前面呃,这个写的比较明确啊,什么活跃设备数哎,新增设备等等的,下边呢,咱们是不是有个叫什么沉默用户,什么本期本周回流用户啊,对吧,这个用户唯一标识也是设备ID,也就是说咱们这一个小节当中的所有需求全部都是用设备ID去标识用户,这个大家搞清楚就可以了啊,那接下来我们看第一个啊,第一个呢,我们是最简单的一个,最基础的一个叫做活跃设备数。
02:08
啊,首先问一下啊,活跃这个概念大家还能记起来吧?啊,什么叫活跃来着啊,一个普遍的理解就是啊,只要你今天登录了,那你就叫活跃了,对不对,但是有些呃,这个企业呢,可能会有呃,稍微特殊一点的这个诶要求啊,什么叫活跃呀?啊就是你登录之后呢,你得做一些操作,那比如说你浏览一篇这个什么小视频啊,或者说你看一篇资讯,这才叫你活跃了,对不对啊也有这样的,也有这样的,当然咱们这儿呢,就以最终普遍的这个理解去定义这个活跃就可以了,那就是登录即为活跃啊OK,那这个先明确啊,然后呢,我们来看一看这个所谓的活跃设备数,那它最终要求我们计算的应该是什么啊,你看最终就一个啥。就是一个数对吧?啊,也就是说我们最终统计出来的应该就是啥呀?啊,就是比如说那咱们这儿有什么日,有周与有月对吧,咱们先不考虑什么周和月,咱们就考虑日啊,那日指的就是啥呀?是不是就是日活呀,那日活就是指的是当日的活跃的设备数,最终我们这个结果的形式应该是什么样的呢?是不是就是今天一共有多少个活跃设备,那到第二天有多少个,是不是每天都会有一个这样的数计算出来啊对不对,那一天一个活跃设备数,一天一个活跃设备数。
03:25
那OK,将来我们做可视化展示的时候,咱们这儿可以怎么做呢?比如说我可以做一个这样的。折线图啊,折线图或者叫做趋势图,那横轴呢,咱们叫时间纵轴呢,叫做,哎活跃设备数对不对,那我是不是可以得到一个这样的趋势啊,对不对,我能够看出来,就是咱们随着这个时间的这个呃变化,那我这个活跃设备数是怎么变化的,我是上升了,我还是下降了,哎,我还是怎么怎么样,是这样的啊,这是咱们这个活跃设备数,我们最终要求的这个结果的形式就是一天啊一个数,一天一个数啊,当然咱们这说的只是日活啊。
04:02
这个能理解吧啊OK,那接下来再往下看啊,那下边这儿呢,我们,呃,对于这种活跃设备数,其实包括下面那个新增其实也是一样的啊,我们会有什么呀,会有这个几个时间节点,比如说哎,算日活,算周活,算月活,哎,咱们会算这些东西啊呃,然后呢,大家要注意区分一下啊,咱们这所提到的月活和周活指的都是什么呢?是自然周,自然月啊,什么叫自然周,什么叫自然月啊。啊,什么叫自然轴?啊,这个主要是跟什么区分啊,因为大家有时候可能会把什么,诶周活,哎周活有可能会以为什么呀,哎,是不是就是最近七天的活跃设备数啊,那月活有的候会觉得是不是就最近30天的活跃设备是不啊是这样的吗?不是咱们这不是什么最近七天,最近30天,我们这是自然周自然月,什么叫自然轴,比如说随便找一找。这一周从周一到周日对不对?那月呢,比如说十月份,从10月1号到10月31号,能理解吧?啊,咱们这儿的周活跃或指的是自然周,自然月啊,这个一定得搞清楚,不是最近七天,不是最近30天啊行,那这个呃,所谓的周活呢,就是啊,一个自然周的啊,这个呃,活跃的设位数,月活呢,就是一个自然月的活跃的设位数,就是这个理,就是这个道理呗。啊好,那接下来咱们把这仨需求定义完之后呢,我们来分析一个问题啊,分下什么问题呢?分析一下这仨需求它的计算频率应该是怎么样的。
05:27
这仨需求的计算频率应该是什么样的,应该是啥样的呀?日活咱们应该怎么算?一天一算呗,对不对啊,每天算的是哪一天的呀。每天做的是不是都是前一天的这个日活,没错吧,一天一算,一天一算,计算频率是天啊,那对于这个周活来说呢,它的计算频率应该是啥呀?那肯定一周一次呗,正常来说对不对啊,因为什么什么时候你才能拿到你这一周的完整的这个周活呀,是不是必须得等得得等到什么本周日结束之后,也就是到了下周一,你是不是才能拿到你上一周一整周的活活跃设备呀,对不对,所以说按理来说这个应该一周一次啊,那月活呢。
06:12
啊,按理来说按月算呗,是不是每月的一号去算上一个月,哎,一整月的这个月活呀,是不是按这样去算呀,哎,没错,这个正常来说,这个计算频率就应该是日周月啊,是这样的啊好,那这点咱们先明确,那接下来我们再思考一个问题。什么问题呢?就是我们去算哎抛活哎月活和日活的时候啊,咱们注意一个问题啊,我们要求的是什么,是设备数对不对啊,设备数咱们肯定按设备ID算,这个很很简单,这会咱们强调的不是这个设备ID啊,我们强调是一个什么呢?是一个重复的问题啊,那我们要想算日活,你肯定得从哪张表里去拿数据啊。正常来说,你从哪张表里去拿?哪张啊?住哪呢?DWD层行不行?
07:04
DWD行不行,行啊,DWD我拿到启动日志,我是不是肯定能求出来对不对,但是你从DWD拿的话,你得考虑个问题啥问题,DWD一行数据是不是一次记录啊,是一次登录记录对不对,我们求的是啥?是设备的个数,所以你得考虑一个什么问题啊,是不是考虑一个去重的问题,因为一个设备一天是不可能启动多次啊,对吧,你得考虑一个去虫的问题,哎,这是你从DWD拿,你要从DWS层拿行不行。行不行也行啊,对不对,相当于我们DWS层做了一个什么,是不是已经做了一个去重了呀,对不对,所以说你从DWS层是不是也能求出来相应的结果呀,啊是不是啊,这个都可以啊,那接下来说周和那周和咱们从哪拿呢。火坐哪呢?从哪来呀?说DWD行不行,DWD行不行也行啊,也行啊,这不只不过就是你考虑去重的问题嘛,啊DWD你把这个一周从周一到周日的数据是不是全拿到,拿到之后呢,进行一个去重计算是不是就可以没问题吧,你从DWS层行不行。
08:11
也可以,你算周火的时候啊,DWS层也得怎么样。也得驱重的啊,也得驱重,为啥呀?啊,因为DWS层咱们说了,我们DWS层一行数据是不是就是一个设备呀,对不对啊,那虽然看似已经去虫了对不对,但是你只在当天去虫了对不对,但是你这你是周火是七天呀,七天是不是有可能一个设备,我在这七天里边多天都活跃了。对不对,那这样一来的话,你你得干啥,是不是还得也得进行去种啊,是这样的啊,那所以说算周火的时候也是一样的道理啊,算周火也算月活的时候也是一样的道理啊,比如说我们去算这几个值的时候呢,咱们需要考虑一个问题啊,就是这个去虫的问题啊,驱虫的问题啊,因为我们要算的不是次数,是设备的个数,相当于是能理解吧,啊OK,就是这么多啊,比如咱们在这呢,需要注意俩问题,一个是计算频率啊,那一个呢,就是咱们这个驱虫的问题啊啊。
09:09
行,那刚才也说了啊,就是我们正常啊,这个需要一天一算,这个一周一算,这个一个月一算啊,但是呢,你看一下咱们这个表啊。啊,其实从这张表就能看出来啊,啊从这表能看出来,我们呢,在这并没有去把这仨需求,并没有把这仨指标,哎我们分成不同的频率去计算,哎在而是而是怎么做的呢?而是在这呢,我们将这三个哎指标的这个计算频率给它统一了,我都怎么算呢。都是按天算的。啊,都是按天算的,再给大家解释一下,咱们这儿为什么这么去做啊。其实理论上来说呢,咱们这就应该分开,哎,一天这个一周这个一个月,但如果要分开的话呢,我们去呃去去实现的话,相对来说要麻烦一些,能不能实现的能实现这个得靠谁去实现呀,是不是得靠咱们那个活渡系统去实现呀,对不对?因为后续这些需求的任务,咱们都得怎么都得怎么做,是不是都得交给咱们那个调度系统,阿兹卡班或者是乌Z去实现,哎让他们去调度对吧?那我这个调度频率呢,是不是你要是得分开算的话,那这个我就得一周呃,一天一呃执行一次,那这个呢,我就得一周一次,这个呢就相当于一个月一次,对不对啊,能不能实现,哎,能实现你需要交给阿斯卡曼去实现,能实现,但是这个实现起来要比较麻烦啊,你需要去配置好多东西比较麻烦啊,那所以说在这儿呢,我们并没有那样去做啊,咱们为了简化后边那个阿斯卡班的这个,呃,配置呢,咱们在这儿当这三个指标,它的计算频率进行了一个统一,咱们都是按天去算,都是一天一算。
10:45
啊,那一天一算的话,咱们这怎么去理解这个事儿啊,你像这个周日活来,你以日活为例啊,那日活你日活我一天一算,这个没问题,你周活你怎么一天一算呢。怎么一天一钻呢?
11:00
啊,怎么一天一算呀。啊怎么算呀,其实很简单,那是不是都都怎么算就行了,比如说那那咱们举一个例子啊,那按理来说我这个周我应该是呃,这个每周一去算上一周的,对吧,但是现在咱们不吃了,我怎么我每天都要算一下,怎么算你认真听啊,比如说今天,比如假如说啊,今天我们就是周一。啊,今天是周一,那今天周一你算的应该是什么?所以应该是上周一到哪到他那个上周日的那一周了,对不对,哎,这是不是能拿到一个完整周的,OK,那你到了这个本周二呢。本章又是啥了呀?应该就是啥,应该就是算的是本周一到本周一的吧,因为周二是不是只能算周一的,你还没有周二的数据吧,对不对,也就是说你周二算的是本周一到本周二的,呃,到本周一的,本周一到本周一也就说实话就一天呗,对吧,那你到了周三呢。是不是就是本周一到本周二了呀,是不是有周一有周二。
12:01
对不对,那到了本周四呢,你算的就是本周一到哎本周三那依次类推啊,直到什么时候你才能把这个本周的周活算完呀,是不是下周一的时候,你才能把这个相当于是本周的周一到周日的给算完,对不对,相当于就是说你每天都算一遍,但是呢,你是不是算七天里边只有一天的结果是完整的呀,对不对,剩下那那六天是不是都是不完整的呀?啊是这样的啊,但是呢,我这样去做的话呢,能保证什么呀,能保证咱们计算频率是一样的,我这个周活,我这个月活是不是都是让咱们每天去执行就行了呀?啊只不过就是我取结果的时候,我们要注意一下了,你要想取一个完整的周,完整的月,你是不是得注意一下,你得找到那个,哎,完整的才行啊,因为这里边是不是有很多是不完整的呀,对不对,那咱们怎么能找到这个完整的呢。那你就得看咱们这个表是怎么设计的了啊,来把这个界面语句粘出来,大家来看一下啊,来,我们来到这来怎么CRLCTRLV来看一下这个地方啊。
13:08
来看一下这个地方,这张表的字段是什么样的,首先我们看它的主见。主线是不是地T啊,是不是就是统计日期啊,对吧,一天一算对吧,一天一算啊,那玩意到下边这是什么?是day countt day countt指的是当日的日活啊,哪一天呢?是不是就是统计日期这一天的这个日活呀,对吧?那下面这一个什么wake count we count是什么?就是抠活,那M们看的就是哎,月活对不对?你看啊,咱们是不是每一天都要算一个日活,周活月活,日活是准确的,但是周活和月活是不是有可能是不完整的呀,对不对,那它到底是完整还是不完整,咱们后续是不是得给它查出来才行啊,那怎么查呢?我们下边又加了俩字段。哎,相当于有两个标记啊,这俩标记分别是is weekend,然后呢,这是is mentioned weekend是不是就是哎周末,哎,Method send就是月末啊,就是月底相当于是啊,那后边这俩值我们相当于是会给他打标签啊,是Y或者是N啊,如果说你这一周,你这个今天你算的时候这一天啊,那就是算的就是有有周末的数据,有周末的数据,那这块呢,我就打一个Y。
14:20
啊,那说明这个week count是不是就是一个完整周的呀,对不对,那如果说你这个是月末是月末的话,我这个就打一个Y,那就说明你这个月末月这个M抗的这个月活,那就是一个完整月的,是这样的啊,也就是说后续咱是不是可以根据这两个字段去过滤咱们这个完整周和完整月的数据啊,对吧?啊然后呢,这张表这样去设计,我们就能够将这个三个指标,周活月活以及日活的指标,哎,他们计算频率统一到这个每天计算的啊,就是为了简化后边的配置啊行,那这个大家说明一下这个情况。行,那现在第一个需求呢,咱们大致的这个呃定义咱们就给大家解释完了啊,就是首先咱们得明确什么是周活,什么是月活,什么日活,然后呢,我们得知道他们的计算频率是怎么样的,然后再一个呢,咱们得知道我们去计算的时候需要注意什么,就去注意那个驱虫的事儿啊,注意驱虫的事儿,那最后呢,我们给大家解释一下这个建表语句啊,键表语句呢这块。
15:21
呃,因为考虑到一个问题啊,就是我们需要统一这个计算频率,所以说我们把这个呃,周活月活呃都放在咱们这个表当中了啊,每天都要去算一下,然后为了区分我们这个完整的周和完整的月呢,啊,我们需要加俩标记啊,加俩标记给大家解释一下行,大致先解释这么多,完了之后呢,我们再看一下这张表的这个结构啊,啊,大家注意观察,这张表跟我们前面的表是不是有点不太一样啊,那这张表呢,我们是不是也没有分区,也没有进行塔馈的列式存储,也没有进行压缩,对不对啊,那为什么呀?咱们一个问题一个问题分析一下,先说为啥没分区啊这张表。
16:02
为啥没分区?因为没必要分区,为啥没必要啊,你想一想啊,就这张表咱们建好之后,你说你每天往这张表里插入多少数据啊。每天往里边插入多条数据。就一条吧。对不对,你是不是相当于把前面那些数据汇总完之后,就一天就一条,对不对,一个日期一天,这个当天的日活,当周的周活,当月的月活是不是完事了,对不对,就一条嘛,一天就一条,所以说你有必要分居嘛,没必要数量太少了啊,那再一个呢,为什么没有进行列式存储呢。为什么要进劣势存储啊,这也得考虑什么,咱们什么时候才有列式存储,是不是OK,咱们说了DWSDWT,那我这个数还有DWT啊,我这个数据这个放在这之后,是不是做需求需要往里边查呀,对吧,我要查的话,我是不是只查某几个列呀,这时候做列存储是有用的,对吧?那咱们ADS层已经已经是什么了。
17:00
已经是结果了,对吧?已经是结果了,那这个结果后续咱怎么用呢?直接使用此库房将全表导到my sol当中,那导的时候你导的是全表,那你有必要进行列式存储嘛,没必要,你也不会说从这里边只选某几个列,对吧?啊,我只能导全表啊,那所以说这边啊,咱们就没必要列式存储了,那有没有必要压缩呢?也没必要,因为数据量太少了,对不对啊,只有一天就一条,一天就一条,我一年才300多条对吧,太少了,所以没必要压缩了啊,所以这张表呢,咱们就是哎,文本文件底层存的就是文本文件啊啊这是这张表的这个结构,我们所有adi层的表都是这样的啊,没有压缩,没有列存储,也没有分区啊啊那这点咱们搞清楚啊,这是关于我们第一个需求的这个,呃,建盘鱼咱们也说完了啊,那接下来呢,咱们就开始去做这个需求了啊啊,咱们一起来做一下这个需求。啊,那做这个需求的话呢,我们其实,呃,这个所谓的需求,所谓需求那肯定都是要干啥,是不是都是肯定都是要进行统计的呀,对不对,那在这儿呢,我们就开始对它进行一个统计啊,开始进行一个统计。
18:07
来吧,那咱们来分析分析,这块我们怎么去做呢?啊,怎么去做。啊,先找第一个字段吧,对抗T啊,咱们一个一个来呗,对不对,对抗的,你说我们可以从哪张表里去求啊。刚才已经分析过了,DWD行不行,行,DWS行不行。可以,哎,那DWT行不行。DP行不行啊,比如说我想获取咱们,哎当天6月14号是不是当天是最新一天对吧,想获取最新一天的这个日活,咱们从DWT能不能学。能不能?能不能咱们去看一下DW层的字段呗,对吧,可能大家这个还是不是很熟悉啊,不是感觉咱们一起看一下,咱们应该找哪张表,找UV topic对吧?咱们找的是设备主题啊好,那你说我从这张表当中去求当天的活跃设备,我能不能求出来?
19:02
可以怎么怎么求。哎,是不是只要末次登录时间等于咱们最新这一天,那就说明它在最近这一天,就6月14号是不是就活跃了呀,那活跃了我是不是就把它过滤出来就可以了,然后最终进行抗是不是就完事了,没错吧,哎,那这很简单啊,哎,那我现在多问一下,多问多多问大家一句啊,假如说我现在呢。求的不是最近一天的日活,我求的是什么呢?我想求历史上某一天的,比如咱们最近今天是14号,对吧,这是最新的数据,比如我现在求,想求一下十号的数据啊,想求一下十号的日货。啊,比如说那天我没球,我忘球了,我今天我想给他补上,那你说我从DWT球行不行。可不可以?啊,那按照刚才这个同样的思路,你要想求十号的活跃设备对不对?那你应该怎么求?只要login it last等于十号,那我求出来是不是就是十号的火炬设备啊,是这个思路不?
20:03
是吧,但是这样求求出来结果准确吗?要不是你。不准确,为啥不准确,你想一想啊,因为什么?因为咱们这张表DWT层的这张表啊,它的login data last是不是会不断的更新呀,对不对?那假如说我现在有一个人,十号的时候,他确实活跃了,也就是在十号那一天的时候,他的末次活跃时间是多少,是十号吧,对不,但是随着时间推移,我到了14号了,14号它又活跃了,那它的末S登录时间是不是已经变成14号了,对不对?那你再通过login data last,等于十号去找的时候,你还能找到这个人呢,是不是找不着了,那也就是说明明他十号活跃了,但是你去找的时候没把他找出来,那你的结果是不是肯定是不对的呀?啊,所以说大家要注意了,我们从DWT层啊,去找这个活跃设备的时候,你只能算哪一天的时候啊。能算哪一天的呀?只能算最新一天的,活跃设备的时候,你能使用DWT层的log net last去找。
21:05
能理解吧,你要想获取历史上某一天的活跃设备,你就不能再从DWT层求了,只能去哪求DWS或者是DWD,当然呢,推荐去哪去哪查呀,DWSDWS啊,这点咱们要搞清楚啊,行,这是关于他,关于它,那目前来看,你说我们。呃,算日活的话,你说咱们从哪张表里去求比较好啊,那既然从哪从哪都能求,那从哪求比较好。DWD肯定不好,对吧,因为最原始的数据虽然大,我们还得聚合,得去除,这个肯定首先排除,那关键就是DWS和DWT,咱们从哪求比较好了。啊,坐哪去比较好啊?ST。很显然是DWS要好一些。啊,为什么啊,你得这从哪从哪考,是不是得看哪张表数据量少啊,对不对,那你想一想,我从如果从DWS层求的话,那咱们应该怎么求,是不是找到DWS层最新一天的分区对不对,是不是从这张表里去求可以了啊,那这一天的分区里边存的应该是啥?是不是就是当天的活跃设备啊,对不对?那假如说现在咱们这个呃呃,企业当中呢,比如说我们有100万用户,总用户100万,那假如说我每天的日活用户呢,假如说啊有10万。
22:22
假如有10万啊,那我DWT层的,那咱们前面说了,它应该是保证的是啥呀,是全量表吧,啊是全量表,那全量表的话呢,假如说我们有100万对吧?啊,全量数据差不多100万对吧,那你你说这俩数据谁大谁小。很显然,是不是DWS层要小一些呀,那是从这个角度考虑我们,哎,如果光算日活,我们从DWS层其实好一些。啊,那接下来我们还得考虑其他的啊,出火。算周火,咱们算的是不是应该是当周的这个,哎活跃设备啊,那当周的,那算当周的话,我应该怎么办?是不是得先找到本周一,然后呢,再找到谁再找到本周日啊对不对,然后呢,把这个本周一到本周日的这个日期这七天的数据过滤出来,当然在这七天,我们虽然说的是七天,但是有可能我是不是算的并不是七天的呀,对,因为可能你今天并不是。
23:16
并不是周日吧,对不对啊,那假如说今天我是周三,我是周三,那你哎大于等于本周一,小于等等于本周日,但其实你从3456日是不是根本就没有啊,对不对,你只有一二的能理解吧,啊这个单搞清楚啊,但是呃,甭管哎他是不是周日,我们都是只获取什么呀,诶周一到周日啊,都是周一到周日啊,那最终肯定有一个数全的,肯定是一个全的啊,那咱们再通过这个标记把这个全的找出来就行,后期啊啊咱们就先这么去去考虑啊,就是咱们这个假如说我现在呢,呃,就是要获取这七天的啊或者七天的,那你说呃这个咱们怎么办啊,还是先分析从哪张表里去查吧,啊那假如说我从DWS啊,从从DWD吧,先DWD最原始那层啊,它能不能求,能求啊,你就通过那个日期把这七天的找到呗,啊,那这个能求,但是数据量太大,咱们直接pass啊,那DWS肯定是不是要比它好一点呀,对不对,那这个玩意儿之后呢,咱们再考虑DWT行不行?
24:14
DWT行不行?啊,行不行啊,这个是可以的啊,比如说我找到DW系统的表,是不是只要他末次登录日期位于。本周一到本周日之间,那就说明他在本周活跃了呀。对不对啊,那所以从这求也行啊,也行啊,那这个咱们先明确啊,那这时候咱们来对比一下,算周和的时候,你说我们从哪啊呃,从d wi层修好,还是从DWT层修好。啊,这个图哪好一些。其实还得根据这个数据量来啊,你得看你们公司每天的日活有多少,你的总用户有多少,是不是得考虑这个问题啊,对不对,假如还是那个,还是刚才那个那个例子啊,假如每天日活10万啊,然后总用户的100万。
25:02
对不对,那所以说你DWT全量那就100万啊,就是你的数据的基基数100万,那你这个假如说每天日活10万,每天日活10万的话,那你七天的数据是不是就是70万呀,对不对,那你要这么比的话,是不是还是DDWS层好一些,没错吧?啊啊这个搞清楚,那下来是月活,那月活其实也是一样的道理啊,你从哪啊,从DWDDWSDWT是不是都能求啊,那还是对比一下DWSDWD是不是肯定先排除,那咱们主要比DWS和DWT。那这个从哪修好液。假如还是10万跟100万啊,那这个显然从哪好一些。DWT要好一些了吧,因为你30天的数据,那你是不是有三十万三百万,那你这个100万,所以说这还是有区别的,能理解吧,就是咱们这个得具体情况具体分析啊,这是咱们分开求,分开求,那我现在能不能就是想办法,就是一次性把这仨值都求出来呢?哎,我如果说都去DWT层求的话,你你注意观察,如果都去DT啥,那你说我求它的时候应该怎么求,是不是从DWT这张表里读数据,然后外管理条件应该是啥,末次登录时间等于这个六月14,然后你要做的事是啥,是抗星对吧,那这个呢。
26:17
是不是也是一样的表,然后呢,也是一样的count,只不过就是过滤条件不一样,那这个也是一样的道理吧,那就是他们仨如果要分开球都去DWT求的话,那那我是不是就相当于是只有外耳过滤条件不同,其他的处理都相同,那所以咱们可以怎么做,是不是用sum if一次性的把这仨指标全求出来呀,那咱们读一遍数据就能把仨指标都求出来,所以说你这仨要放一起的话呢,那咱们还是从哪更好一些呀?WT更好一些啊,DT更好一些,那所以说现在呢,我们就从DWT去求一下这散值,那怎么求啊,直接就select from d,然后呢,来一个啥u topic啊,那上边咱们需要分区吗?没有分区对吧?所以直接选就行了,那首先第一个字段some if。
27:03
啊什么一怎么求啊,是不是if只要末次登陆时间等于哎2020杠零六杠幺四,那那那我就记成几记成一,否则就记零,哎,那这样一来,你得到的是不是就是6月14号的日活。对不对,那咱们是不是还得算一个周和呀,对不对,算一个周和,那这个周和咱们怎么求哎三。哎,是不是也三衣服啊啊if哎,那咱们是不是只要去判断一个事儿就行了,判断只要你末次登录日期位于咱们本周一到本周日,哎,那我我就怎么样,我是不是就给你记个一,否则就记个零啊对不对,那这个怎么去判断呀。怎么去判断莫次登日期是否位于本周?啊,是否关于本周,是不是就是只要它大于等于本周一,小于等于本周日就行,对不对,那怎么拿到本周一的日期啊。咱们拿到是不是咱们前面讲过呀,怎么拿,是不是select,咱们用谁date at加next day那个函数不就可以得到呀,对不对?那首先我们先获取下周一的日期,是不是能获取,能获取是不是next day啊next day,那next day呢,我们把谁放进来,哎,把这个2020杠零呃六,然后杠幺四先放下来,那下周一下周一是不是可以传一个Monday day Monday,或者传一个Mo或mon都行啊,俩字母仨字母或全称啊,那这样一来咱们得到应该是啥视频呢?就是下周一的日期6月15号,但是我们现在想得到的是谁?
28:34
那它是本周一对吧,本周一得怎么办,是不是把这个日期再给他减个七就行,所以说咱们这的CTRL,哎,X。啊,那就呃,相当于是得塔A啊date_ad然后呢,把它先放进来,然后逗号是不是减一个七就行了,好,那现在咱们看一下这个结果对不对啊走。好,6月18号应该就是6月14号所在周的周一日期,咱们可以去检查一下来往上翻,往上翻啊,找到六月六月啊,6月14号所在日所在州的什么呀。
29:10
所以周的这个周一日期是不是就是6月8号,没错吧,诶那就搞定呗,啊OK,那这是周一日期,那周周日的日期怎么获取啊。周日怎么回去?啊,怎么获取。是不是就减一就行了呀,对不对,先得到下周一,然后再减一,是不是就本周日对不对,那所以说减一就行啊,那这边呢,我们也是执行一下,那六月14,六月14刚才也看了,是不是本身6月14号这一天,它恰好就是周日啊,没错吧,诶拿到呗,啊那所以说咱们这个周一日日期,周日日期,那咱们就这么获取就可以了,比如说这个呢,是周,哎周一的啊,那就要在这if if什么呀,Login date。Last啊,怎么样大于等于周一,然后呢,并且and啊这个login date last lo date last慢小于等于哎周日周日是不是就它,那就把它拿过来CTRLX,然后呢,我们放在这个位置CTRL。
30:13
V,好,如果满足这个条件,那我就记个什么,也就记记一说明它在本周活跃了,对吧?那否则我就记啥,哎,我就记零啊就记零,哎完事啊,那这个来一个逗号啊,那这相当于求出来的我们的这个周活了啊,那接下来求是不是得求月活了,那求月活咱们怎么怎么处理啊,是不是也得是sum if啊来我们some来if。来吧,求月光。最后是不是只要你的末次登录日期位于本月就行,对不对,那怎么怎怎怎么整啊。为本月。位于本月,也就是说login date lo啊,这个date,然后last last位于本月,诶这怎么办?怎么判断是否位于本月?
31:01
那按照刚才这个道理,这个是不是可以通过,是否大于本周一啊,然后小于本周日,求出来对不对,那这个可以怎么做。是不是可以大于等于本月一号啊,然后小于等于本月这个最后一号,是不是可以通过这种方式去做,行吧?啊,但是其实这没必要这么去做,咱可以怎么做呀,我们在这儿呢,可以将咱们的日期,就是这个莫斯登的日期做一个格式化。啊,格式化成什么样子呀。只有年和月。对不对,我把日去掉,只要你的年月相同,那是不是就是位于同一个月是不是啊,那所以这怎么处理啊,那咱们这这么处理一下啊来我们CTRX应该是不是用data form去格式化呀,咱把这个日期放进来给它关格式化成什么样了呢?YYYY啊MM,然后哎,就完事了。啊,然后呢,它等于什么,只要它等于哎,再来一个data format把谁放进来呢?把当天日期2020杠零六杠幺四,那它也格式化成什么样子,也格式化成这种,哎,YYYY啊然后呢,啊,MM这种格式。
32:12
啊,你想一想啊,那这个结果肯定是啥,肯定是2020杠零六对不对,这是不是就是六月份,那这边是不是就能把login date等于last log date last等于六月份的是不是全找出来呀,那所以这个呢,直接这样就能找到本月的数据啊,那同样如果位于本月我就记个一,否则我就记个零,那咱们得到的就是哎,本月的月火。搞定。啊,思维应该是这个道理,那当然咱们现在如果说去把这个执行一下的话呢,这仨结果应该是怎么样的呀。这仨结果应该是啥样的呀,肯定是相同的呀,为啥呀,因为咱们只有一天的数据,对不对,那所以一天这个日活周和月活都是相同的啊,这个是肯定的啊好,那这个让他跑一下就行,那咱们一会再看结果吧,行,那相当于相当于我们已经把这个最关键的三个字段是不是已经求出来了呀,啊已经求出来,你看是不是都是一样的呀,啊都是一样的啊啊已经求出来了,那求完之后呢,我们大家需要去考虑一个问题啊,考虑一个什么问题,就是我们前面这个是不是还有其他字段没写呀。
33:16
这两这三字段咱们怎么写,比如说日期。嗯,这个日期怎么整这个日期。啊,哎,这个日期咱们怎么整,怎么选这个日期啊。咋选日期?当选日期。啊,怎么选日期。这个日期很简单呀,啊,怎么简单。我日期我自己写行不行,2020杠零六杠。幺四。我我统计的是不是就是这一天的日活,以及这一天所在周的周和和所在月的月活,就是不是就是这个意思,那所以这直接写呗,我们塞来的时候是不是可以选择常量值啊,可以选常量值啊,没问题啊,当然你在这选常量值,那你后期是不是这个思索得放到脚本里边啊,放脚本里边这你就得怎么办,是不是用Dollar do date替换呀,对不对,这虽然是写死了,但是后续放到脚本里之后它就活了啊啊,这是这个字段,然后再往下,下边是不是还有两个这样的东西呀,这俩东西就是俩标记,一个是判断是否是周末,一个是判断是否是月末,那返回值要么是Y,要么是N,对吧?那所以咱这俩字段可以怎么去做呀?
34:27
其实在这呢,很显然这个应该用谁用if去做,为什么?因为这你是不是首先得需要一个波尔条件去判断一下,然后呢,如果是true,那我就返回Y,如果是false,我就返回N,那是不是肯定用if去做呀,正好用if,那来吧,那咱们就判断一下呗,来我们先来一个if啊,来我这呢,应该是后边少了一个逗号啊。那这边接着写,那就关键是怎么判断,咱们6月14号它是否是周末对吧,怎么判断呀。周末的日期咱有没有。周末日期刚才刚求了对吧,这是不是就是本周末这个日期啊,你把它拿过来呗,如果说咱们当天的日期也就是2020杠零六杠幺四,如果说等于。
35:13
本周日日期,那我就返回啥,我就返回Y,否则呢,我就返回N,这没错吧啊,那这样一来你是不是就能够把这个今天是否是周日给他标记出来了呀?啊如果今天是周日,也就是说你最近一天的数据是周日,那就说明什么?说明你6月14号算出来的这一天的数据,那你的周活就是啥。就是整个周的周火对不对,因为你今相当是最后一天的数据,就是周日嘛,对不对,相当于你这一周的数据是不是全了呀,对不对啊,那这就是一个完整的了,那这儿呢,我就给它标记成Y嘛,啊后续你去做展示的时候,比如说我只想拿完整周,完整月,那是不是可以过滤一下,只拿这个是否是周末为Y的这个数据啊,哎,就完事了啊,那接下来同样的道理,那个月末怎么做,是不是也是判断它是否是月末呀?诶,那怎么去判断今天的日期是否是月末呢?
36:08
能不能获取每个月月末的日期?能不能能啊,咱不是前面讲过一个函数叫做last day函数吗?Lasts,诶那这个函数它只需要我们传一个参数,只需要传,诶这个应该是零六杠幺四啊,只要传一个什么,是不是只需要我们传一个日期,然后呢,它就给你返回你这个日期所在月的月末日期啊。对不对,那这个是不是直接判断就行了,哎,如果是的话,那我就返回啥,我就返回Y,如果不是的话呢,我就返回一个N,诶是不是完事了,那这个S后咱们就执行一下走。哎,你看就完事了啊,你看这是不是我们6月14号这一天的日活周活月活,然后大家刚才看了6月14号本身是不是就是周末呀,所以说是否是周末是啊,那当然现在咱们求出来这个也不是一个完整周的,为什么不知啊,因为我们只有一个周日的对吧?因为前面周一周二到周六是没有啊,但是随着这个时间的推移,我们到了下一周啊,比如下下,嗯,第二天是什么呀,第二天是不是6月15号啊,6月10号应该是周一对吧?啊,一直走走走走走走,你你等到这个最后那个这个6月15号这一周的周末的时候,那这个是Y,那它求出来的是不是就是一个完整周了呀,是这样的啊,那这个是没有问题的。
37:28
行,那咱们这个,诶所需的数据呢,就全部都查到了啊,所需数据就全部查到了,那完之后呢,咱们需要干啥。需要干啥,是不是需要把这个结果最终插入到咱们这个表里边啊,插入到ADS表里啊,那咱们怎么插入啊。Insert呗,对不对,那前面我们全是insertright对不对,这次咱们应该怎么办?这次应该right还行不行。不行了,为啥不行了,因为咱们这张表并没有分区,对吧,你要yes right是不是只能是往整张表里right,那也就是说你每天都往这里边覆盖,也就是这张表里永远都只有几条数据啊,永远都只有一条,对不对,那所以咱们这儿呢,直接in enter or right是不行的,那咱们就得enter啥呀,In enter into into宅into a Di层的U抗了,哎是不是就完事了,诶那这样完了之后,确实我们能保证我们这个数据呢,每天往里写的时候呢,哎,不会把原来的覆盖掉,对不对,但是这里边其实是有问题的。
38:26
啊,有什么问题呢?俩问题啊,第一个问题,因为是阴度,阴度是追加对吧,对不对,那你每天假如说这个任务,我们假如说有有这个重有有需要重跑的时候,因为什么,因为咱们ADADS需求是不是很多呀,对不对,Ad需求很多,那很多的话,那我们后续这所有的表,我们还是会放在一个脚本里,你放到一个脚本里,那假如说我这个前边十个表成功了,后边十个表诶失败了,那失败之后是不是整个任务都要重跑,都重到前边十个任务是不是还得再跑一遍,跑一遍是不是这个数据就会重复,对不对,这是一个问题,就是into嘛,追加你可能会重复,你要重跑的话会重复。
39:04
那还有一个问题。这个重跑这个重复的问题,其实还好啊,你你后续去展示的时候,你去个重就行了呗,对吧,这个还好,那关键是有一个问题,咱不能忍,哪个问题呢?小文件的问题。啊,为什么要写文件呢?你要思考一个问题啊。思考有什么问题?大家思考啊,我这个insert into,咱们虽然叫做追加,对吧,它这个所谓的追加是针对谁来说的。是针对于have的这张表来说,我叫做追加,对吧?嗯,但是对于HDFS的文件来说,它是追加吗?我每次音色into对于文件来说是追加吗?不是的,它是什么呀?每次是不是都会生成一个新的文件呀,对不对?因为咱们相当于每天执行这个色的into的时候,那每天跟每天之间是不是相是两个独立的任务啊,对不对?我第一个任务把这张表对应的路径下边,也就是这个路径下我会写一个文件,这个文件只有一条数据吧,哎,小文件啊,那到了第二天呢,还会再来一个新文件,第三天再一个新文件,就是日积月累,咱们小文件会越来越多,对不对?
40:14
啊,假如说我们保留一年的数据,一年的数据,你像以这张表为例,它自己就300多,300多个小文件,对不对,那我这个需求很多ADS能表示很多,我几百张表,假如说几百张或者几十张表,那我这个小软件是不是就成千上万了呀,对不对,这很显然这个是不好的,很显很显然是不好的啊。那大家有没有什么方案能够把咱们这个小文件解决一下,喂,好,那咱们有没有什么方案能够把这个小文件解决一下呢啊。有没有什么方案啊?你要想解决小文件,是不是就不能用ER into啊,对于你只要into,每天into是不是肯定都是小文件,那你不用into用right的话呢,那你这个数据又又不全了,对不对,那现在好像陷入了一个这个困境啊。
41:03
怎么都不行。啊,有没有同学能想到一个比较好的解决方案啊?有没有能想到?有同学说了,弄一个临时表是吗?啊,临时表怎么整?再追加会覆盖,嗯,具体方案呢,具体方案呢。没太想好是吧,你再想想。有没有同学能够解决这个小文件的问题啊?文件问题可以怎么做,大家觉得?可以怎么做呀?首先大家得知道这个之所以出现小文件问题是因为什么?因为咱们每天都是into是吧,每天into那肯定有小文件呀。
42:02
啊。哎,怎么做可以怎么做说。撞一下,怎么撞?啊,诶,你这个思路差不多是对的了啊,就是他他的意思什么呢?是可以这样啊,这先把这张表当中啊,就是每天往这个表里导数据之前啊,先把这张表的数据先查出来对不对,查出来之后呢,再怎么办,跟今天的数据做一个。是John吗?你再想想是John吗?应该是union吧,对吧?啊,相当于把这个数据先查出来放在这,然后把今天,今天是不是就一条,把这一条跟他再做一个合并。哎,合并完之后呢,是不是再给它放回去。那这样一来是不是就没有小文件了啊,相当于每天把今天的数据跟原来的数据我做一个合并,哎,我不让他直接往里边去加一个文件对不对,那这样一来就能解决小文件问题了啊,那所以这块咱们要改的话,这应该怎么改呀?很简单,我们直接select星from as个we count对不对?那先拿到它,那它之后呢?那下边这个是不是就是我们今年的新数据,那它俩需要做一个union对不对?诶那union有两种,一个是union,一个是union奥,对不对?那union奥的话,那去虫吗?
43:19
驱虫不,尤尼尔是不会驱虫的,那咱这有没有驱虫的要求呢?有没有,那其实可以有啊,对不对,那假如我现在用union,用union的话,那相当于什么,像我这个数据,那跟这个数据啊,那他俩这个相当于是进行合并的时候会做去重,那做去重的话,那相当于我们这个任务后续可以怎么做了呀,是不是就可以重复执行了,因为它是不是会自动去重啊,那当然这就不用into了,咱们用啥得得用啥,是不是得用right呀?啊right加一个table,那这样一来的话,我们这个问题是不是就解决了,那这两个问题都解决了啊,我这个是不是能解决小文件问题,是不是这个任务现在就能够重跑了,就不会重复了,对,是这样的啊,而且这边呢,你其实只能用union,你用union不行。
44:06
啊,你用UN union啊,这个是不行的啊,为什么不行呢?因为这块的have给咱们做了一个优化啊,做了一个优化啊,你现在想一想,你自己分析分析。呃,如果用UN尿优尿是不去虫对不对,那我现在相当于是是不是从这张表当中啊,查数据查出来,对,然后呢,再把这条数据是跟他做一个啥。是不是做一个合并,对,相当于相当于原来那个数据你变了吗?是不是跟你根本就没变对吧,就是have,人家这块相对比较智能,他知道你这张表里的原来的数据根本就没变,所以他根本就没怎么做呀,根本就没查出来。根本就没查出来,他直接还是把你这条数据是不是以一个新文件的方式给你追加进来了呀,对吧,他这做了一个优化,你这你可以自己去测一下啊,就是如果说你这用union奥的话呢,这块没效果啊,没效果咱们这呢只能是用union啊啊union,因为union你是不是得去虫,去虫是不是必须得用到这里边的数据啊啊,那他这就就必须得查了,查完之后再往里放啊,是这样的啊,那这块大家要注意,这个咱们要解决小文件问题,以及文件的重跑以及数据的重跑问题,那咱们就得这么去写这个词后了啊啊当然这个文档上这块,呃没有这么写,文档上就直接就是查出来了,而且文档上这个查的话呢,它还是怎么查的呀。
45:24
它还是分开求的,是不是从DWT也是从D去求,对吧,但是求完之后呢,它又给它是不是撞到一起了呀,对不对,那这边咱们不这么写啊,咱们就按照这个咱们刚才课上讲的这种方式去写就行啊好,那这个词课咱们相当于就哎搞定了啊好,那我把视频录一下。
我来说两句