00:00
好,那么接下来呢,我们看第二个需求是这个商品主题宽表,那在商品主题宽表当中呢,也是第二需求,我们之前也说了,是最复杂的一个需求,当然有了第一个作为基础。那其实我们也知道了他的一个套路,那无非我们要分析关于商品我们要出哪些指标,对吧,然后找到每一个指标对应的。主题,然后我们同时消费多个主题的数据,然后呢,把这个数据变成一个统一的。刘。对吧,变成统一的一个流,那变成统一流呢,所以我们要对每一个前面的流过来做加工处理,把它处理成。同一个相同的招聘,然后呢才能去union。对吧,之后呢,将数据呃要做。提取时间戳对吧?Union之后提取时间戳甚至wordmark,然后分组开窗聚合对吧?在聚合的时候呢,我们还是用这个增量聚合加全量聚合的方式,也就是说reduce方程结合着window方程来做,因为我们需要拿到窗口的时间啊,当然其实这个地方可以省一个啊,我们就拿开窗。
01:22
窗口的开时间或者结束时间都行,但是呢,我们就两个都获取了,因为最后呢,我们需要用它来实现我们的密等性的一个操作,假如说任务挂掉重新消费的时候,这个窗口的数据呢,我们要重新再写回去。对吧,啊,还是要做这样的事情,所以思路呢我们得有,但是商品主题跟我们的访客主题还是有一些差别,那我们主要分析一下它的一个差别在哪,对吧?好,那首先第一个我们来看这个需求啊。呃,围绕着商品的,那商品呢,它肯定也有很多的一个维度信息,那商品的维度信息无非就是SKU SKU trademark category等等这些信息,对吧?啊,那将来呢,我们要算的指标就是点击。
02:12
点击曝光收藏,加购,订单支付退款评价啊呃,那有的同学的电脑呢,到这个需求就跑不起来了啊为什么呢?你看啊,那关于点击和曝光。它属于什么数据啊,属于我们,我们数据源是有两两种嘛,一种是行为数据,一种是业务数据,那点击和曝光它属于什么数据。点击和曝光。属于对行为数据对吧?呃,而下面从收藏加购物车。下单支付退款评价啊,这些东西呢,就属于我们的。
03:03
业务数据了啊,那这块呢,有很多同学就跑不起来了,因为这个时候我们就要将行为数据跟业务数据前面内容呢,都要一把开起来,然后呢才能做这个内容的一个测试。对吧,特别是业务数据,我们要开这个Phoenix等等的一堆东西啊,行为数据呢,要开log对吧?啊,当然ZK跟卡普卡这个是共用的,这个还好一点。对吧,所以有很多同学抬不起来了,呃,那具体的我们要分析每一个数据怎么做,但是在这个基础上我们还要做一个事情,什么事呢?来看啊。首先刚才我们提到了商品的这个维度,对吧,我们粗略的估计。啊,粗略的估计啊,它的维度有几个呢,你比方说SKU。那我们是不是要放SQID和SQ内对吧,那SPU。一样的吧,Name和ID,然后trademark。
04:02
Trademark,还有这个category。对吧,那这就是这四个对应的应该是八个。维度了,八个维度,也就是说在表当中呢,首先有八个维度字段啊,就是最后的招聘,然后加上ST e dt。这就十个了,然后还有一个TS。对吧,11个啊,再看我们需求啊,我们需求呢,总共有八个。总共有八个对吧,那刚才我们说了,这是11个加八,这是19个了,但是你要知道,对于订单支付退款这些东西呢,我们还要知道一下,它不止。一个需求,对于下单而言,我们是不是要下单的。订单个数。我们要求订单的个数以及下单的总金额,还有当前这一件商品被下单的件数,注意下单,刚才我们说订单的个数呢,它是被下单的次数对吧,那还有一个个数。
05:10
还有个数对吧,还有一个金额,我们肯定要求的,因为我们要求GMV嘛,对吧,所以还有金额,那你看看这一个下单就对应的三个指标,三个指标的话就三个对吧,那支付同理,退款同理。对吧,所以我们粗略的估计一下,第一个当前这个我们要统一的这个招聘呢,得有20多个字段。对吧,得有20多个字段,之前呢,我们是12个字段,这个20多个,那如果20多个的话,我们看啊,之前我们是这样来做的,来,呃,直接呢,在这边去捏一个对象。对吧,然后呢,有很多给的是默认值,当然这里边只有四个啊,咱们给的是默认值,所以还好,但是对于我们这个而言,你看啊,这八个指标,这八个指标,八个指标呢,刚才我们算了大概有这边是三个,这边三个,这边三个再多六个,那就是14个指标,14个指标对于点击而言,它只有一个数字要改为EL,对吧?来了一条数据,我就定一个EL,那其他13个都是默认值。
06:16
也就是说其他13个都要写明,那通过原来的这种方式啊,就写的太冗长了。对吧,那这个时候我们想我们可以用一个什么样的方式来做这个事情,大家有没有想法,我不想直接用这样对象,那有这个字段我就给一下,没有这个字段呢,我就默认值。其实之前我们大量的碰到类似的操作。我们可以用什么?我们这样写代码的时候,在源码当中啊,我们自己调用API的时候,它大量的应用到这种操作。
07:01
就当字段特别多的时候,有一些字段呢,我们直接用默认值就好了,我就不给了。对吧,有没有同学知道我们可以这块用什么模式。当然最简单的就把20多个字段,你有一个对象把20多个字段全部传进去,对吧。哎,夏总说了builder没问题啊,也就是说这块呢,第一我们跟前面不一样,在这块呢,我们要做一个builder,要用到这种构造的设计模式。对吧,我们这个招聘呢,自己写一个构造者设计模式的一个招聘啊,当然呢,这个比较简单啊,比较简单,因为在Java当中这种东西用的比较多,所以我们也没必要所有东西都自己去写,我们加几个什么呢?加几个注解就搞定了。啊,这是第一个,我们要用构造者设计模式来创建我们的这个招聘了,而不像之前这种方式,对吧,比较麻烦一点,之前的这种方式呢,呃,充斥了大量的默认值,那没必要,对吧,这是我们要考虑的第一个点啊好,第二个。
08:08
那我们来想啊,呃,什么事呢?刚才我们说了这边维度啊,至少有这么八种,对吧?SKU SKU trademark k有这八种,呃,但是你要注意在我们的下单和支付表里边,这个维度信息是不全的,因为我们已经关联好维度了,但是除了这两张表之外。啊,除了订单和支付宽表之外,你再想一想啊。其他的比方说点击、曝光,收藏、加购这些里边我们对于商品而言,是不是只有一个KD?对吧,也就是说点击曝光收藏我们怎么办?还差了这七个维度。对不对,那这个问题我们应该如何解决呢?
09:02
想一想。因为像点击曝光,收藏加购啊,退款呀,评价呀,这里边儿我们并没有去关联过维度信息。对吧,只有SKD,那怎么办呢。思考一下。啊,我看有没有同学能够解答这个问题啊,有想法的都可以说一说。想一想啊。没有同学知道吗?
10:07
你要想没有这些维度,因为我们要达到这八个维度,最后呢,我们要K,肯定要按照这八个维度做K,拜吧,对吧,但是呢,点击曝光我们都没有啊,那怎么办。去挨辈查好,那有在提到了,呃,去贝查,那也就是说我们点击数据过来之后,我要去挨贝查一下补充字段是吗?然后每一张表这个还有这个。我都要去做这个事儿,除了这两张表,我都要去做这个事儿,对吧。是这个意思吗,向总?
11:04
我们都要去查一下,把这个维度信息全部补充上。Union之后再查。把它关联起来之后再查,其他同学呢,还有没有什么其他的想法。对吧,有没有什么其他的想法。Unit之后查跟应之前查,它的区别就在于代码上。我们。少写一点代码对吧,你要是八个啊,我们初初步来看应该有八个流对吧?我们现在还不管哪些流可以合并起来啊,呃,那八个流我们就每一个再都要写这个代码的话,太麻烦了,那向总说了,我们可以unit之后再查,那这样代码呢,我就写一份就够了,因为unition之后,不管你之前有多少个流,Union之后呢,那我只有一个流。
12:02
对吧,但如果说union之后就查的话,那比方说点击数据,它有一条,每个数据都有一条啊,假如说每一条数据刚好只有一条,呃,那么是不是说一年之后查或者还要查八次啊。对吧,就八条数据要做查询吧,对吧,假如说我这个八条数据刚好这个SKD相同呢。我们可以具体的能不能再简单一点。能不能再简单一点?我们要思考这个数据。纬度数据之间的关系了。按照SQID聚合之后再查,哎,没有问题。
13:03
对吧,啊,向总一步一步的,其他同学呢。就是这样啊,我把这个说一下,就是说你看啊,因为我们说了要按照八个维度做批办啊,但实际上我们知道每一个需求当中,我们每一张表里边呢,都有一个SKYD,没有问题吧。这些个字单里边都有SKID,好,那我们想啊,刚才我们说了,我们要按SKUSKU以及trademark,还有这个categ,对吧?但是我们知道一个SKU是不是唯一能找到s t trademark和category。对不对。就是由SKU出发对吧,它跟下面的维度对应是不是都是一比N的关系。注意啊,一步一步跟上这一步有没有问题。
14:05
这一步有没有问题?应该没有问题吧?好,那我们想啊,既然SKU对应的SKU trademark和开轨都是一对一的关系,那我们再思考一个问题。我按照这八个。维度,同时KBY算出来的结果跟我只按SKUIDK聚合出来的结果是不是一样的?是不是一样的,大家想一下这个问题。是不是一样的。
15:07
对吧?啊,这个就完全是一样的,好,那既然是一样的话,我能不能先按照SKID做一个KB啊,结果聚合起来之后我再去查,这样我们是不是查询或者说查询ready的次数要更少一些。对不对。有没有问题,一步一步跟上啊,这这是第二块啊,第一个我们说的在这里边呢,我们要用构造者设计模式去这种方式来写这个招聘,那第二块呢,就是说我们要看到不是说所有的表都有这个八个维度。对吧?度量是你自己的,肯定有对吧?八个维度不一定大家都有,所以呢,我们就想办法,第一我们最开始想的就像向总说的,我们可以用SQID去关联里边的数据,查这个数据,对吧?但是我们发现啊,那每一个人去查的话不方便,对吧,你代码重复太多了,所以这个时候当时只有向总跟我互动啊,然后呢,他说诶,我们先UNUN起来之后再查啊,这样的话,从代码的角度来说,我们少写了很多的代码,对吧?但是呢,从查询数据库的角度来说,数据这个次数并没有减少啊,那我们就想着,诶按SQID去分组跟按八个人分组查询出来的结果是完全一样的,所以我们可以先聚合,对吧,聚合好以后再去查啊,第一代码量也少了,第二访问。
16:41
Ready或者说的一个次数也就减少了,对吧?啊,所以呢,我们就敲定了这样的一个方式,好呃,那这里边呢,又有同学有一个问题了,什么问题呢?之前有同学问到的,或者面试官问到的,我问大家啊,嗯,那看啊,既然DWS层到了这个商品主题宽表当中,我们最后呢,还是要去访问这个Phoenix或者说这个red对吧,那我问大家一下,那我前面这个事情不白做了吗?
17:12
那我前面只需要写订单和订单明细的关联,对吧,因为在这个时候,反正最后要查,我在取订单数据的时候,我也可以只取SKUID。对吧,包括取支付数据,我也只取SKD,我们一定要把那八种都取出来。因为最后呢,还是要按照s kidd进行分组,那我之前DWM层,呃,那我可以不做这个维度关联啊。对吧,这是一个面,有的面试官提出来的,那这个问题如果问到你应该怎么去答呢?你现在去想一想。
18:02
对吧,那么显得我们DWMDWM层中间层啊,那不是很蠢吗?对吧,做的这个事情。是不是也给大家问到了。问倒了对吧?诶仔细一想,好像是这么回事。那我之前订单去关联,或者支付去关联。给ADS,其他的需求用,蒋总你太强了。对吧,我觉得此刻需要鲜花和666。啊,需要鲜花和666。但是有的同学可能刷了鲜花和666之后,还不明白什么意思啊啊,那我问大家啊,你想一下之前在做这个离线数仓的时候。
19:01
在做离线收仓的时候,呃,你的ADS层所有的指标都是从DS或者DWT出的吗?也就换句话说,之前在离线数当当中,咱们ADS的指标有没有直接从DWD出呢?有没有?有吧,是不是对吧?呃,我们之前在建立这个数仓的时候就聊过了,DWS和DWT呢,它只能应对我们生产环境当中绝大部分的需求,你不可能说生产环境当中所有的需求都可以从DWS或者DWT出出来。对吧,那也有部分需求要从DWD或者其他的地方排出,当然肯定不会到ods,对吧?那在实时数仓当中,我们有没有可能从DWM层直接出指标,那当然是有可能的,对吧?啊,所以刚才那个蒋总说的就没有问题,给ADS层其他的需求准备的。
20:16
对吧?虽然我们在DWS层构建这张表的时候显得诶,那个时候做的事情很蠢,好像没用上,但实际上并不是。对吧,并不是的,这个要注意一下我们做的这件事情。OK吗?这个能理解了吗?并不是说我们白做了一件事情啊。啊,我们可能还有其他的需求,直接从DWM走出对吧?啊更方便,那我们把提前维度关联好了,是不是出指标更为方便一点啊,这个能明白吧。对不对。又没有响应了。
21:04
好,每次都是向总的啊,要没有向总我这个课。面试官怎么知道这么细节的东西?那你以为呢,面试官跟你开玩笑呢?对吧。他可能听你说了,吐了,但是人蒋总是不是很快就反应过来了?人蒋总是不是很快就反应过来了,对吧,直接就说了,是不是给这个ABS其他的需求指标要用对吧。啊,你要把离线输当跟实时输当结合起来看啊,其实他们他们俩做的设计呢,都很像对吧?好,那这里边这是我们所说的第二个第二个点对吧?啊第三件事情就在于什么呢?呃,第三件事情是针对于这三个指标而言的。针对于这三个指标而言呢,呃,那这块怎么回事呢?是这样啊,那看啊有没有公司,他可能是这样,嗯,什么样的呢,我同一个订单当中。
22:07
我在同一个订单啊,也就是说奥ID呢,都是1001,假如说1001个订单对吧?呃,那有的公司啊,它的一个内容是这样子的,什么样子呢?在这个订单当中,我们不要拆订单明细嘛,是按这个商品来拆的,但是呢,在有的平台当中啊,他能不能出现这样的SKU。这个呢是零一对吧,然后呢,SKU dad01。在一个订单当中,正常来说,诶,那不会出现这种情况呀,你如果说买了两件,不直接乘以二嘛,对吧,假如说我不是从一个商家买的呢,我不是从一个商家买的,对吧,整个平台我下到一个订单里边,我对这个SKD我加了两次订单,我就想对比一下两个不同的商家这个产品的好坏。
23:02
对吧,那我提出来这个大家想一想我要说什么了。啊,思考一下,这个时候我们都是在做这个需求分析啊。也就是说我们可能一个订单拆出来两个明细,但是两个明细当中的SQID怎么样相同?哎,万达说了要做驱虫。啊,没问题,就因为刚才我们提到了,在下单过程当中,我们的度量呢,有一个度量叫。下单的次数啊,虽然你拆成了两个明细,但是属于同一个订单里边,如果按照SKUID过来计算指标的话,那么这个订单呢,我只能累加一次。
24:00
对吧,如果不做任何处理,那这个是不是相因为我们关联了这个明细表,对吧,它就拆成了两个明细了,如果直接简简单单的来一个订单我就加一,来一个订单我就加一,那么这一个订单是不是对于当前这个商品计算了两次。对吧,所以我们要做驱虫,那我们接下来就思考这个驱虫。我们应该怎么做呢?对于这个驱虫,我们应该怎么做呢?对吧?啊,思考这个问题,这个问题解决完之后,我们就可以开始动手写代码了,那写代码过程当中就每一张表,我们要去看一张,每张表具体的写法,对吧?有的表呢,可能写法不一样,那大家有没有想法,诶我们要对这个订单ID做去重。
25:24
没有想法吗?我们做驱虫已经做过很多次了呀。对吧,一提到驱虫,你脑子当中想到的有哪些东西,你给我敲一下。对吧,如果说让你去做一个驱虫,这个时候你第一反应我们有哪些内容可以做驱虫啊,大家可以把自己的想法,然后打在这个公屏上。Need逐渐。
26:02
啊,利用幂等性做驱虫,好,那符总说了主见。还有呢?还有没有,我们其实讲过驱虫的方案很多呀,还有没有可以做到驱虫的?状态RA set。啊,好。Clickhouse replacing tree,呃,那这边啊,要注意一下。幂等性呢,其实在这一块就不管用了,为什么?因为我们对这个数据呢,要做聚合啊,大家说了这么多幂等性主见,我们一个一个来分析啊,第一个幂等性。那幂等C呢,首先在这块呢,就要干掉,为什么?因为我们是要将结果聚合了之后写出去,那你都聚合出来了。这个都算出来是一个二了,你怎么去重啊?没办法了对吧,所以这个呢,直接pass啊好逐渐逐渐这个没太明白什么意思啊,然后说状态ready set,那这样状态跟呢,我把它归为一类。
27:09
监控状态和red归为一类,如果说在Spark streaming当中它没有状态,那我们可以用RA来代替这个内容,对吧?在link当中,往往来说呢,我们可以选用这个状态来做,因为更方便一点。对吧,啊,更方便一点啊,所以呢,我们可以用这个状态来实现这个功能啊呃,那状态的话,那也就这个意思吧,呃,我们按照这个m midd啊,不是midd啊,按照SKID做一个分组,然后呢,保存它的一个O的ID,如果说这个SKD来了。对吧,来了来了之后呢,我们看一下当前这个数据啊,当前这个数据all ID有没有有没有对吧,用这种方式,呃,但是有一个问题啊,因为你想想看,我们最后呢,做的聚合是不是十秒钟一次啊。
28:02
那你这个状态到底保存多久呢?对吧,不好说啊,那有的人说就十秒呗,十秒不行,因为你前面是留一条一条的过来,最后呢,你刚好把十条数据给他做了一个处理,所以你这个状态呀,咱们这个状态还真不好说保留多久。对吧,还真不好说啊,呃,所以呢,状态这个东西如果你要用的话,你没办法删了,那接下来一个问题,Set,哎,Set这边其实就蛮好的,对吧,因为我们是十秒做一次聚合,十秒做一次聚合,所以我只要在聚合的时候做一次驱虫是不是就好了。我在过来一条数据的时候,对于订单,这个对于订单的一个次数,我们不计算来一条数据的,我不写一,我干什么事呢,我还是正常的把这个凹的ID给它写出去。
29:05
对吧,最后在窗口聚合的时候,我对all ID这些数据呢,我把它放到同一个set里边,然后取出来一个set的大小是不是就够了。对吧,其实这里边儿最优的方法是什么。就是用set。对吧,就是用set这种方式。啊,就用赛的方式啊呃,那刚才我们分析了密信呢,这用不了状态的话不好用,因为你这个状态它的一个过期时间不好说。对吧,你最后是按十秒,你不能直接设置为十秒,因为数据源是源源不断过来的啊,你也不知道这个数据到底是属于当前窗口还是下一个窗口的,不好说,对吧,所以用set的方便的点在于,最后呢,我们是要按照十秒做一个聚合,所以在这里面呢,我只有十秒的一个状态的数据,把它保存下来就行了。
30:02
对吧,啊就是这个意思,那所以呢,在这里边我们要多三个set。啊,在招聘当中要做三个set对吧?呃,分别用来做下单支付和退款的内容。一个订单,两个相同商品,这两个all the detail ID应该是不一样的,要去重吗?不应该记两次,注意我刚才说了,就是因为all ID all the detail ID不一样,但是你要注意它的all ID是不是一样的。它的O的ID是不是一样的呀。对吧,那既然all ID一样,那你我要统计下单次数,下单次数,下单次数肯定是根据订单来的,而不是根据订单明细来的。OK吗,对吧。
31:04
下单的次数是根据订单走的啊,不是根据订单明细,那有的公司就说就跟那个彭总说的一样,对吧,我就认为他是同一个订单,或者说我公司就不存在一个订单当中两个完全相同的产品,如果两个相同的产品就SKUID相同的话,那我就认为是同一个商品,我直接乘以二就是个数直接是二,那这种你也不用考虑对吧,我们就希望把这个东西搞得复杂一点,假如说你公司当中你你复杂的会了这种对吧,你公司当中需求简单一点。那不就更好做了,你不用用这个set直接来一条加一条对吧?啊,所以我们把这个需求呢,是设计的复杂1.ok吧?啊,其实这个就是我们当前这个需求当中要做的这件事情,就是包含的一些细节的内容啊,包含的一些比较细节的地方在这儿啊,好,这个这块我们就分析清楚了,那接下来就是跟访客主题一样了,对吧,把这个事情搞定之后,就跟访客主题一样啊好,那我们来把这个解。
我来说两句