00:00
来,那咱们现在首先呢,先考虑一个这样的问题啊,就是DWT跟DWS啊这个数据有啥区别啊有啥区别。呃,首先明确啊DW呃什么层DWS层啊,那我们是按天汇总,只有当天的行为,对吧?刚才大家已经做完了,你看我们计算的时候是是不是就能体现出来啊,只只拿当天分区的数据进行汇总啊,就是当天的行为啊,然后呢,DWT呢,我们说了是累计值啊,累计值啊,按这个比如说最近七天,最近15,从开始至今啊,总的累计值等等等等啊,所以有这个区别啊,按完之后呢,我们来看一下咱们这个,呃,会员主题啊,在DWT层的这个累计表是什么样的啊,先把键没有语句拿出来。然后呢,我们再说它里边的特点来。CTR位,诶放在这个位置啊,来咱们看一下吧,这个字段是不是看着有点多了呀,对吧?二点多了啊,那首先呢,我们还是先来把第一个问题说明,就是这张表当中它的一行数据指代的是什么啊,你其实可以看它这个表里的字段就能看出来,主键是不是有个ID啊对吧,这是ID,那所以说这里边这张表里一行数据我所指代的是不是应该也是一个user啊,也是一个user,然后呢,后边所有字段都是这个user的各种累积值吧,啊就是一个user一行,一个user一行,把这个搞清楚,其实咱们DWS层一个分区里边是不是也是一个user字一行啊啊一个右段一行啊,咱搞清楚行,然后先把这点明确啊,然后呢,我们再来看一下他这张表当中的这个字段啊。
01:39
来看一下,先看这几个。你看啊,这几个是不是全是这个,呃,像累积指上你看啊,有什么累积登录天数,这个累积登录天数指的是什么?是从始从开始啊至今啊,就从开始到现在,我总的累计登录天数是多少,能看懂吧?啊这是一个啊,然后下边这儿呢,还有一个什么最近三十日登录天数,是不是就最近三十日的呀,那还有什么,还有什么最近七天,最近15天,咱们这没写啊,但是应该有应该有,呃一般情况下,我们去做这种统计的时候呢,呃,一般也就是看最近七天,最近15,最近30,最近60,基本就是这几个时间节点啊,那咱们这儿呢,呃,就没有写啊,没有写,只写了一个,但是其实你算的时候呢,这个算法都是一样的啊啊,这是最近30天,当然之后除此之外啊,上面还有俩时间。
02:28
还还有俩字段,一个叫做首次登录时间,一个叫做末次登录时间,首次末次。诶,首次动时间,末次录时间,那这俩东西啊,哎。大家说它叫做累积值吗?啊,好像跟我们这个下边这俩这个相比,这个累积的没有那么明显,对吧?啊没有那么明显,但其实啊,我们如果说呃,从哪从哪个角度去考虑呢?从这个计算的这个数据量去考虑,那这俩其实也可以算作累计值啊,为什么啊,你想一想,假如说我要想算这个累积登录天数,也就是说你需要去求一个user从开始至今一共登录了多少天,那你所说所需的数据应该是哪些呀?
03:16
是不应该是所有的启动日志从开始到现在的,是不是都得拿过来你才去求,才能去求一个user的累计登录天数啊,对吧,那如果说你要去求这个首次登陆时间和莫斯录时间呢。是不是也得把所有的登录日志拿过来,然后呢,去求每个用户最开始的和最后的一个登录日期,是不是也是所有的数据啊啊其实你从这个他们计算的数据量来看呢,其实这个它俩这个呃数据量是相同的啊,计算的时候啊,是这样的啊,那说这个呢,咱们也给它也管它叫做一个累计值吧啊首次和墨存动的时间,然后这俩时间可能大家现在呃体会不到啊,这俩有什么用啊,但是一会儿咱们后续呃得到ADS层啊,到ADS咱们去做需求的时候呢,你就会发现啊这俩字段很有用啊,比如我现在举一个小例子啊,就想举个什么小例子呢。
04:07
那现在呢,求一下我们今天新增的会员有多少个,或者是把咱们那个新增会员找到啊,因为咱们这个优的是不是就所谓的会员啊,对吧,找出来我今天的新增会员。怎么找就行,首次登录时间等于今天是不是就行,没错吧,哎,就是它很有用的啊,我们后续好多需求都会用到首次或者是末次登录时间啊,后续呢,咱们再说啊,这是这俩时间。行,那接下来再往下走,那这几个字段呢,是跟谁相关呢?是跟下单相关的,那这里边包括首次和末次下单时间,这里边呢,有诶累积的下单次数和金额,和最近30天的次数和金额,那同理下边支付是不是也是一样的字段呀,都不一样的,那还是那个道理啊,就是这里边是不是也应该包含我们其他事实表的那个聚合值啊啊累计值,但是咱们这儿呢,诶同样是没有加上啊,那大家也可以看到咱们DWT和DWS层,咱们这个字段这个主题是不是也是对应的呀,那字段分为这个什么?登录分为下单,分为支付,咱这儿也是一样的啊好,那这个我们搞清楚就行。
05:10
这是这张表里的这个具体的字段,咱们介绍完了,那完之后呢,再看一下这张表,这张表呢,它怎么样,它是不是没有进行分区。是没有分区啊,这个咱们得注意观察一下,这张表呢,没有分区啊,没有分区。啊,这是我们大家需要注意的啊,好,那先把这给他那个呃搞清楚啊,搞清楚之后呢,我们再来分析一下啊,分析一下咱们这张表当中啊,我们每天是不是得往里边去更新数据啊,对不对,既然没有分区,没有分区的话,那你想一想啊,这里边有些字段啊。咱们每天就得,就得怎么做,就得改,就得变,比如说谁会变,比如说末次登录时间,什么累计增加数,这是不是都有可能会变呀,对不对,都有可能变,那每天变,你说咱们应该怎么变。
06:01
也也就说说实话,说白了就是咱们往这张表里每天更新数据,咱们应该怎么更新对吧?啊,怎么往里边导数据啊,这个应该怎么办。也就是circle怎么写啊,装载数据的circle应该怎么写?嗯,咋写呀。怎么整?嗯,应该怎么搞。啊,就so咋写表给你了怎么写。哎,能不能也按照我们刚才DWS层那种呃做法去做呢?DWS层咱们是不是逐一的分析了一下,我这个表里的每一张,每个字段应该来自于咱们哪张表对不对,然后呢,把每个字段都求出来,求完之后呢,再给它召到一起,是不是咱们之前是这么做的呀?对,那这张表咱能不能也这样去做呢?能不能也这样去做呢?咱们来分析一下啊,那比如说咱就这样去做,那来看一下,你说这俩字段,我们应该来就这一大堆吧,应该来自于哪张表,肯定是DWD层的OG,没错吧,那这一大堆表呢。
07:12
来自哪儿啊?是不是来自于咱们那个订单实时表啊,其实或者说来自于哪也行啊。来自咱们DWS层是不是也行,因为DWS层咱们是不是也是按天分区,每天都记录,每每天的分区里都记录了当天的登录行为和下单行为,对不对,是不是用用它也行啊,用它也行啊,那同理这个呢,能找到DW层的实时表或dwi层的这个用户的,哎,那个行为填表其实也是可以的啊,那个填表就是你对抗啊对抗的啊,就是这样的啊,也就是说你也可以这样去做。但是这样去做的话,你看看这个性能怎么样啊,来我们来看一下,你要想计算这几个字段啊,比如说首次登录日期,末次登录日期,你只能怎么做。只能每天都怎么样啊,每天把咱们的所有的启动日志,或者是把DWS层啊DS什么样,那个全表是不是都拿过来,拿过来之后呢,你要求的是每个U字的首次和末次,同时时间应该怎么求啊这个circle。
08:13
怎么写呀,是不是按照user分组,然后呢,求一个最小的日期和一个最大的日期,那是不是就是每一个用户的首次和末次登录日期,没错吧,那这个累计登录天数呢,是不是也得基于所有的数据啊,基于所有的数据啊,然后呢,按用户分组,然后呢去count呀,哎,或者这里边可能会需要去重啊,可能需要去重,因为一天里边可能出现多次,对吧?啊,我可能驱虫什么的,如果从DWD层去赌数据的话啊,然后下下来最近30天,这个呢,不用拿,全部拿最近30天的数据就可以,对不对?那图理你下边这些东西呢,是不是也得把所有数据都拿到,因为你这有首次,有末次,有累积,对吧?那这个也是一样的啊,那如果说咱们每一天都这样去做的话。不是全表,每天都全表,那随着时间的增长,咱们这个分区会越来越多啊,我保留半年数据,会一年数据100多分区,300多分区,那每天都这么算。
09:09
是不是这个计算量有点太大了呀,对不对,这很显然是不好的,而且你要知道啊,你在里边绝大部分的计算呢,可能每天都是重复的,对不对啊,你想一想啊。假如说我们现在这个,呃一这个书仓里边,假如说我现在目前啊,有100个分区,有100天的数据啊,对不对,那你算100天的数据的时候,你是不是需要把这100个分区全拿出来,然后去进行计算,然后到了第二天,第二天这个分区一共多少个了,是不是101天啊,对不对,那完事之后呢,你是不是再把这101个分区全拿出来,但其实100这100个分区你已经计算过了。对不对,第二天你是不是再重新计算一遍啊,这个是不是就太麻烦了,这种计算方式很显然咱们不应该这样去做啊,那咱们应该怎么做呢?不应该每天都去重新计算所有分区。
10:01
那怎样做要好一些。大家觉得?怎样做好一些?哎,对,咱可以这样去做啊。我能不能利用一下原始的这个计算结果,历史数据我能不能利用一下呢?比如说那假如咱们现在已经算到一百一百天了啊,那这张表当中啊,是不是应该有咱们前100前100天的各种累计值对吧?什么首次末次都是啊,还有累计增天数是不是都针对前100天来说的,那然后呢,我到了第101天。啊,那我这时候呢,我是不是会有一天的新数据啊,对不对,包括这一天的什么新的登录记录,新的下单记录和新的支付记录是不是都有啊对不对,那都有完之后呢,咱们可以用这一天的哎,各种记录去干什么呀?去更新咱们这张表里原来的知识,对不对?举个例子啊,比如说以累计登录天数为例,那假如有个用户啊,我今天也登录了,那你就直接怎么做就行,在原来那个基础之上,我加个一是不是就行。
11:01
对不对,那这样一来,你那100天数据是不是就不用再重新算了,是这样的啊,那咱们应该诶用这种方式去做是比较好的啊,也就是说我们大致的更新思路应该什么样的呢?我们每天需要从这张表当中把数据先给他查出来,查来之后呢,然后拿到咱们今天的各种记录,包括登录记录,包括下单记录,包括支付记录等等等等,全部拿到,对不对,全部拿到之后呢?啊,然后呢,我我我我是不是又得对比一下啊。是不是得对比一下,因为有有可能什么,有可能我有些用户啊,我今天没有活跃没活跃,你像什么累计登录天数这个会变吗?是不是不变呀,对不对,保留原来的值,那如果说对于今天你活跃了等等等等这样的,哎,那我就需要给你在原来的基础之上,我把今天的这个结果给你加上,然后再给你更新回去,是不是就行,哎,是不是应该也得对比一下呀,是这样的,那他呢,应该是这样的一个逻辑啊,每天都这样更新,那咱们这个计算量就会少很多很多啊,就会少很多很多。
12:00
啊,这是咱们后续每天都要做的事啊,那每天更新这么更新,那我问一下啊,那咱们这个表啊,我们第一天应该怎么做。第一天应该怎么做?啊,像这种表呢,其实我们第一天呀,我们应该给他做一个初始化,应该做一个初始化啊,其实你从这张表的这个字段特点来看啊,你应该能够隐约的感觉到啊,我们这张表应该要求啊,这张表当中它应该是一个什么表啊,这张表应该是一个什么表,应该是一个全量表。应该是一个全量表。啊,应该是全量表啊,它和我们DWS层不一样,那DWDWS层因为我们统计的是什么,是当天的值对吧,是当天的,所以说你当天的分区里边只只有谁,只有你当天活跃的那些人,对不对,但是咱们这张表呢,是是累计值对吧,累计值你像啊首次登录时间,莫斯登的时间。你像这些字段,我是不是不管这个人他今天有没有活跃,我是不是也得有一个首次和末次登录日期啊,对不对,所以说你像哎这张表当中,我们应该是有这样的要求的啊,DWT层所有的表都应该是全量表。
13:15
啊,全量表,也就是说哎,User主题,那我这张表里就应该包含什么全量的user啊,那如果是商品主题呢,就应该包含全量的商品。啊,这是咱们对DWT层的表的一个设定啊,是对它的一个设定啊,是这样的。那这张表是全量表,那既然咱们要保证这张表它是一张全量表,那所以说我们第一天就需要对它进行什么。需要对它进行什么呀。需要对它进行初始化呀,对不对啊,咱们第一天我们书仓刚开始搭建的时候,那咱们需要怎么做呀,需要去咱们的业务系统当中,MYSQL当中去拉取我们这张表所需要的数据,然后呢,对它进行一个初始化啊,对它进行一个初始化。
14:10
啊,就是这张表呢,初始化是有必要的,那是有必要的啊,那我问一下啊,你说咱们这儿这个初始化应该怎么做呀。这张表初始化。呃,咱们文档上的这块,嗯,没有初始化这个步骤啊,没有没有写在这儿,那咱们现在一起来分析分析啊,这个初始化咱们要做的话,应该怎么做。一起分析啊,初始化怎么做。初始化就是做一次就行了,对吧,那首先你必须得先保证你得拿到全量的用户才行,对不对,这个从哪拿就行。这个你从买搜狗里边去拿一下也行,或者说你现在从哪拿就行,从咱们那个用户的拉链表里拿就行,对吧,为什么?因为第一天的时候拉链表是不是就做着初始化了,对不对,那里边已经有全量用户了,对不对,所以首先我得需要先把全量用户拿到。那接下来下边啊,首次登录日期。这个怎么办?
15:00
这个按照我们的分析登录日期,咱们是不是根据启动日志了,根据咱们那个日志来的呀,对不对,但是这个日志我可以跟大家说啊,就是如果说我们公司里边之前是没有出仓的,很有可能你那个买点是没有的,因为买点是不是就是服务于咱们出仓的呀,对不对,那买点很可能没有,买点没有是不是日志就没有历史数据,是不是就没有历史的日志,没有历史日志,那你说你像这种值。咱们是不是就不好求了呀,你初始化的时候你就求不了了,对不对,那求不了咱只能怎么做,只能想办法去获取啊,前面从哪获取,从咱们的业务系统,从买思当中,你看能不能找到一些值啊,可以把这个来进行初始化,如果实在找不着,那就怎么办啊。只能是来一个初始值,一个默认值啊,咱们这儿来分析分析啊,首次登录日期如果没有日志啊,咱们因为第一天嘛,没有历史日志对吧,我从初三开始我才有买点对不对,那没有日志,那这个怎么办?首次登录日期咱们可以怎么做?
16:02
诶,其实可以,咱们可以从哪啊,可以从咱们买词当中那个用户表里边找哪个字段。右边是不是有一个cur time create time是就是这个账号的创建时间,那创建时间是不是就可以作为首次登录时间,哎,这个实际上是可以的,对吧,那末次登录时间呢。莫斯登之间有没有?莫泽龙,时间有没有?这个一般情况下,咱们在MYSQL当中可能没有记载MYSQ,没有记载我们日志,也没有原来的数据,对吧,那这个只能给默认值了啊,只能给默认值了,比如说给什么呀啊就给,为啥,因为你不知道他最后一次哪天登录的,你可以改成谁,改成跟他首次登录时间一样的。可不可以可以啊,因为你也不知道他到底最后一天,最后一次是哪一天,你随便给一天就行,你就改成跟首次登录时间一样的啊,是这样的啊,然后呢,累计登录天数呢。是不是也是没有记录啊,没有记录的话,我这就改成多少啊。
17:01
给成一呗,因为你首次登录日期,首次登是肯定有一次啊,对吧?哎,你给成一就行啊,这是初始值,那最近三十日了呢啊,最三十日咱不知道啊对吧,也不知道,不知道这你就随便你给零给一都可以啊,就是一个初值而已啊,是这样的啊,所以这块呢,我们大家需要把这点搞清楚,因为这块我实在是拿不到初始值,我只能给自己定义一个了啊好,这是关于他们几个啊,那完事进来看下边。这几个,哎,这几个你来想想看看他能不能拿着值啊,这个值首先它不是来自于日志的,对吧,来自于买S,买S是不是肯定有原来的数据啊,有所有订单,是不是有所有订单,哎,那既然有所有订单,那咱们这几个值肯定是能够初始化的,你这个需要怎么做呀,大家想想。我需要首先把my circle当中的order in for这张表全导过来,注意这次导你得全量导,对吧?这你得从MYSO当中去导了啊,去买so当中把order ino这张表全量的导到我们的书仓里边啊,导到书仓,你这时候你得建一张临时表,只得建一张临时表去装咱们那个全量的订单呀,对不对,去装它啊,完了之后呢,你就得想办法去获取这几个字段了。
18:15
OK,获取每个user的首次下单时间,末次下单时间,这个怎么求,是不是把这张临时表,这张临时表是不是就是咱们目前所有的订单,哎,把它拿过来,然后呢,对它进行选择,那按谁分组,按user分组,然后呢。是不是求一个最小的下单日期,那个下单日期有没有,订单表里是不是有一个cur time对不对,Cur time就是下单时间呀,对不对,那这个你就可以求出来每个U字的什么首次下蛋时间。还能求出来什么,每个user字的末这个是不是就是一个最小值,一个最大值啊,是不是就能求出来了?OK,这个搞定,那累计下单次数呢,是不是直接count就行雷下金额求和啊,那还有一个最近三十日的这个怎么办?又怎么初始化?
19:04
这其实可以啊,咱们可以根据谁是不是可以也从这张临时表里去选数据,但是这个得过滤一下了啊,得把什么样的过滤出来。Time。对不对,他得在最近30天的才行,对吧。能理解吧,啊cur time位于最近30天的这样的订单找出来,然后呢,去进行count和sum求和,那这几个字段咱们是不是就能够完成初始化了呀,而且这个初始化它里边的值是不是准确的。是准确的,因为我们都是从咱们的业务系统当中拿回来的数据,咱是求出来的,而不是自己给他指定的,所以这几个都是准确的,这能保证准确的初始化,好,那就来下边下单支付这几个呢。支付这几个怎么办?它能不能进行初始化可以吧,这个是不是也是从咱们买SQ当中,你需要把谁把支付那张表全部导过来,注意全量啊,然后呢,放到我们还有的一张临时表里。
20:05
然后呢,从临时表当中去选数据,那当然这个选的话也是按照谁呀,按照U分组,然后呢,求一个最小的最大的支付时间啊,然后呢来count求和,然后呢,再把最近30天的这个数据过滤一下,求一下就行了。是这样的啊,这是我们这个表的这个初始化的工作。说话的工作咱们这没做啊,为什么没做呢?因为我们现在咱们那个买思科当中是不是只有一天的数据啊,咱们这个初始化什么时候才需要去做呀,一般情况下。就是你的业务系统当中已经有历史数据了。对不对,已经有历史数据了,那你才需要做初始化,如果说你的调系统,也就我们来测后,那边跟你的数仓诶你是同步开展的,比如说咱们现在到公司之后呢,我可能是一个新公司,新公司我这个APP呢,刚开始啊这个发行,然后出仓同步搭建,这时候你需要做初始化吗?不需要,因为没有历史数据对吧,你同步开展,那但是这种情况很少,一般情况下咱们到公司之后呢,那肯定都是啥呀,业务系统已经开始运行好多年了,然后呢,我才开始拉储仓历数据,肯定有有历史数据,像这种表咱们就得做做啥呀,就得做这种初始化啊,那一般哪些表需要做初始化呢?你像我们前面有些表是不是没有提初始化这个事儿,然后这张表咱们就需要初始化,对吧?哪些表需要初始化呢?
21:24
啊,首先咱们先说DWD啊,你对DWD来说,DWD来说我们有维度表,有事时表对不对,一般哎,谁需要做初始化呀。啊,对,你那种拉链表啊,拉链表啊,你需要做一个啊这个初始化。啊,因为咱们维度表咱们是不是一共分为两种啊,两种哪两种,一种是全量表,一种是拉链表,对不对,一种全量一种拉链啊那全量表需要初始化吗。不需要,为啥,因为你你你是不是每天都是全量导啊,那个是不需要初始化的,但是拉链表,因为你是新增级变化对不对,每天知道新增级变化,那所以说你第一天导的时候必须得做初始化,这个能理解吧?啊,你得保证你的维度表当中得有全量的用户才行啊,所以说你需要初始化,那事实表一般情况下是不需要做初始化的,事实表一般不做初始化实表,因为我里边存的就是啥,是不是就是咱们这个呃,明细的操作呀,对吧?啊,那你原来已经过去的,我就不会再统计了,我从出仓之后再开始统计,所以它一般情况下是不会做初始化的,它一般不做啊,也是维度表里边的拉链表一般会做初始化,然后呢,咱们的试时表一般不做啊,那接下来往下走啊,还有什么样的表呢,就像咱们这种。
22:41
啊,这种表啊,DWT层的表,咱们需要做这个初始化啊,其实呃,这个也没有什么,就是呃,一般情况下不会说根据什么嗯哪一层去确定这个表要不要分层啊,就是主要是看需求,就是你你就看你看你的这个表的定义,如果你要求我这张表当中得有全量的啊这个信息,那你就需要做初始化啊,你看咱们这张表,我就要求他得有全量的用户,那我就得做初始化,是这样的啊,你就看具体要求了,你看他到底要不要求啊,你有全量的数据。
23:12
要求有,那你就得做初始化,不要求那就不用做了啊,主要是看这个啊那个那这张表呢,这个初始化呢,咱们文档上没有啊没有,因为我们那个呃买soq当中本身也没有这个数据,所以这个初始化呢,在这就没必要做了,如果要做的话怎么做,刚才已经咱们分析过了啊,你需要从买SQL当中啊去拿全量数据,然后呢,去计算一下这个初始值,然后后续啊,初始化做完之后,那后续每天咱们怎么做呢?啊,这是初始化说完了,那后续每天咱们应该怎么做呀。应该怎么做,那是不是就应该是把这个数据拿过来对不对,把这上面,因为这里面已经作为初始化了,对吧,里边已经有初始值了,对不对,那后续咱们应该怎么做,应该就是以这个表的数据为基础,然后把每天新导过来的这个行为拿过来,然后怎么办,以原来为基础,然后再进行啊这个累加操作对不对啊,这就是我们每天重复做的事儿了。
24:08
是这样的啊好,那这是关于这个DWT层,咱们这个表的这个初始化和每日更新的这个说明啊,好,我把视频录一下。
我来说两句