00:00
好,那在正常的开始我们上课之前呢,我们纠正一个问题,前面有一个代码呢,写的有一点小问题啊,是昨天有同学就提出来的啊,提出来他发现了啊,这个确实是上课的时候疏忽,呃,在哪呢?在我们的DWS层,关于这个。哎,它配置VIVO啊,关于他啊,我不知道是不是有其他同学有发现,但是没跟我说啊,但是有的同学发现了跟我说了。啊,那我们看一下还记得这个需求吗?这个需求来看一下。这个呢,是我们过滤出首页跟商品详情页。对吧,过滤出这个首页跟商品详情页,呃,干什么事呢?统计首页及商品详情页的访问人数,这个需求可还记得。这个需求记得吗?就是你看这个过滤你就知道了,对吧,我们过滤出来只要首页和。商品。
01:00
详情页吧,然后呢,提取每天诶首页跟商品详情页啊,文档没问题,对,我上课的时候敲的敲的有点问题啊,敲的有点问题,呃,那么这边呢,我们过滤出来这个首页跟商品详情页,也就是说咱们的数据流里边,这个流里边有两种数据,一种呢是首页,一种呢是商品详情页,之后呢,我们过滤出这个独立访客对吧,那么有两个状态,一个是。首页一个是商品详情页的一个状态啊,之后呢,我们因为我们是要求每天的嘛,所以设置了个一天的时间,那没有问题对吧?好,那之后呢,我们来判断诶,取出这个状态,如果状态为now,或者状态的日期与当前日期不相同,那么我就认为它呢。是一,哎,这看上去没有问题,但是这里边其实有有毛病,毛病在哪呢?因为我们呢,这个数据里边是有两种的,哎,那这个数据我们刚说了,它要不然是首页,要不然是相同条件,它不可能同时满足两个条件。
02:14
对不对,他不可能同时满足两个条件。啊,它不可能同时满足两个条件啊好,那怎么办呢?就是这边我们得加一个。判断对吧,得加一个判断啊判断,因为如果你直接这样写,比如说我现在呢,是第一条这个m mid的第一条数据,它的呢,首页跟商品详情页。状态都是那。那么如果咱们这样去写。那是不是两个都改为一了?首页跟商品详情页都改为一了,那这个不行对吧,所以呢,在这个前置,我也不在这个代码的里边就改了,我直接在这儿加一个判断if对吧。
03:01
这边呢,要加一个这个红点。啊,然后VALUE6点。Get杰森,先获取配置,然后再获取当前的。配置ID对吧,那如果说呢,你当前是这个首页,诶,那我再在里边去判断,呃,否则你要不是首页,那你就一定是商品详情页对吧,他不可能有其他的这个呢,倒还好理解,因为我们前面过滤的时候,我只要。商品详情页跟首页对吧,所以呢,我这边也不用写else if,说这个good detail.equals对吧?去判断也没必要啊,那咱们直接就写else就行了,当然你说我就非得写else if对吧,我去判断good detail.equals这个东西可不可以呢?可以。
04:00
对吧,但由于前面我们已经做了这个过滤了,那这个其实可以不写了,可以不写了,OK吧啊,它这个点啊,在这儿就是说我们少写了一个判断啊,少写了一个判断,这个呢,就给大家去把这个补一下,确实之前呢,写的时候呃,漏了这个点了啊,漏了这个点了OK吧啊就来有人提出来,那我就必须得在班上把这个说一下,可能有同学呢,有没有发现到这个点。啊,但是现在你就要知道啊,因为整体的就说一下,有同学发现了跟我说了啊,挺不错的啊好,那我们把这个解一下啊,那咱们还是同样的把前一天我们所讲的内容呢,做一个回顾啊,前一天呢,我们是写了当前这个叫用户啊PU力度下单各窗口的。汇总表对吧,当然这个PU呢是。商品的信息里边的一个点对吧,但是除了SPU之外,呃,有这个trademark。啊,有这个category我们都放进来了,因为它都属于这个商品的。
05:04
维度对吧,都属于这个商品维度跟SKU相挂钩的。好。那在这个需求当中呢,咱们讨论了要做的几件事儿,第一那它是一个下单需求,我们首先呢要驱虫,因为这里面呢,我们除了要求这个什么人数啊,更重要的我们要有这个订单的。金额。对吧,我们要取出来这个订单的金额。没毛病吧,啊,咱们要取出来这个订单,订单的一个金额啊好。那所以呢,我们必须要做这个驱虫,那我们分析发现呢,它这个数据啊。这个金额所谓的金额都是来自于订单明细表。对吧,好,那连订单表里的金额呢,我们都没有去用。啊,那他这个要做驱虫是因为我们上游使用了这个left drawing。
06:02
去关联着这个订单明细活动表与订单明细购物券表,所以它有可能呢,会出现多条数据撤回嘛,对吧,第一条数据先写进来了,左捺写进来,然后呢,写一个捺,整个数据都是捺进来对吧,然后再写一个左右,诶两个数据补全了,那我们左捺跟左右这条数据呢,应该是同一条,只不过说第一条左捺是因为右边数据没来。所以导致这个问题对吧,而现在呢,我们的数据在右边。是不存在的,我们没有用到右边的数据,所以我们的驱虫方案呢,可选的就可以选第一条,因为这样时效性其实是最好的。对吧,啊,它的时效性是最好的,因为我第一条来了,我可以输出,我不用像之前说的这个做一个。状态。对吧,搞一个状态,然后搞一个定时器啊,不用这样,因那样的话你会有这个延迟,你所有数据呢,假如你定时器统五秒,你所有的数据呢,都会延迟五秒,不管说是这个数据只有一条,还是说他有三条五条的时候,对吧?啊,那他都会延迟个五秒的触发,而如果说我们取第一条,那那样的话,他没有延迟,第一条来了,直接输出后面的就干掉就行了,对吧,那但是他有前提条件,他呢不是说所有的时候都能用啊,它呢是建立在我们嗯所说的。
07:21
你必须呢,要做到。右表的数据你在后续呢,用不到才可以,对吧,因为大概率第一条来的右边为档的,因为我们不可能说大概率它乱续吧,对吧,我们考虑的是更多的公司当中数据呢,肯定不出现乱序,就是少部分出现乱序对吧,也就绝大部分的第一条数据,假如说它有多条啊,第一条数据呢,右边都是那对吧,后面呢,才会慢慢的把它补充上,是这个意思啊,所以呢,我们完全可以用这种方式啊好,这是第一个要考虑它的一个驱虫,对吧,第二个呢,就是关于微表。啊,第二个呢,我们要做这个关联维表,因为我们分析发现这个表里边呢,要用到PU。
08:00
对吧,就看需求,我们都要用到这个PU,那就不聊了,PU呢,本身在我们这几张表里边,它都没有。他一个都没有对吧,所以只能通过关联表的方式去把它拿到。啊,只能通过关联为表的方式把它拿到。对吧,啊,所以呢,这里边呢,要做一个关联维表这个事儿啊,那另外呢,就是我们额外扩展的东西啊,就是说它的一个关于订单数要做这个去重的事儿。对吧,我们求订单,那这个呢,是少部分公司可能会有这样的需求,我告诉你更多的公司呢,可能不需要,对吧,就直接来一条累加一条,来一条累加一条就行了啊,但是如果说未来你们公司恰巧对吧,就要需要去重呢,那你也会这种方式啊,但是我们现在还没写完,我们是把all ID呢保存到每一条数据,诶每一条数据来的时候,我们把它保存下来,我们不把这个数据呢转为一。对吧,我不写outcome count outcome count暂时不写,因为写不了,因为如果你写一的话,你就没办法做这个outcome ID去重了,所以呢,我们在转账病的时候呢,写的是。
09:04
把这个ID写出去,最后呢,我们准备到这个。数据当中对吧,到这个聚合的时候把它呢。系统。啊,把它做一个去重对吧?啊但是呢,呃,因为我们要考虑到聚合对吧,我们想用reduce的这个方案,所以呢,我们采用的是这个set来存这个奥的ID订单的ID对吧,存存一个set啊,因为他们两个可以做一个累加,同时呢,还能够天生的可以做的这个驱虫这件事儿,对吧。好,这是订单的一个驱虫,那之后呢。啊,咱们又。讲了一个点,就是说这个招聘呢,不同于其他的招聘,他的招聘里面字段呢比较多。对吧,他招聘里边字段比较多,所以这个时候如果说你呢,就直接用我们传统的方式,直接用这个对象,那我们知道你字段多,那没办法,你本来这个需求涉及到字段多,但是关键问题在于我们刚转化为招聘的时候,他绝大部分字段。
10:10
都给不了。对吧,你要不然他给一个空串,要不然他给一个nu,因为我们写的大部分都是string类型嘛,对吧,你只能这样去给那。这个就不好了。这个就不好了。对吧,这个就很不好了啊,在于这儿啊,你你很多太冗余了,你没有用,所以呢,在此基础上呢,我们把这个招聘呢,设计成那个构造的设计模式的一个方式,对吧?但是这个也还好,我们只是写了一个build的这个注解,也是我们那个小辣椒这个插件啊,就用B这个插件底下的一个注解,对吧,它可以帮我们去构建这个内容啊,就是你未来呢,你想要给的字段,你自己给一下就好了,其他的呢,你不用管了,对吧,不用写那么多啊这个意思好,这是我们之前分析的要做的一个这里边要做的事情,那之后呢,我们就分析了整个的一个程序应该怎么去。
11:03
写对吧,在这个地方。啊,消费数据转换,转换之后呢,按违一键去重啊去重之后呢,转换数据结构这一步呢,转化成我们的一个实体类了,对吧,在这个时候保留我们的OID。啊,这个就关联为表,补充这个分组所需要的这个信息,对吧?啊,那后续呢,聚合好以后再去补充分组不必要,但是最终结果可能需要的这个维度,对吧,而且我们说了把这个分开呢才有好处。啊,它有好处对吧?呃,因为我们聚合前数据量肯定会更大,聚合后数据量会更小。对吧,所以说呢,咱们将这种不是说必须的纬度斯段放在分组后。分组聚合以后。那我们访问数据库的次数就降低了,提高了整体的一个效率。对吧,是这意思啊,那之后呢,这前面这些东西呢,都还好,都好写对吧,那刚要的我们写到这一步,写到这一步呢,第一次我们想着,诶,那每一条数据呢,都要去补充这个维度信息。
12:11
啊,本来我们想着跟维表关联,我们有一个lookup join,但是呢,它是属于这个Li s里边的啊,那我们既然选择了用data,我们就不用这种方式,那我们就怎么办呢?你不是数据流吗?你不是一条一条数据来嘛,对吧,那来一条数据呢,我就去查一下这个Phoenix。刚开始这样想的,对吧,哎,把我们数据查到,查到以后呢,给它补充到我们当前的这个数据里边,这样就搞定了。对吧,啊,咱们是这样想的啊,呃,那在此基础上呢,咱们就。写了一个工具类。对吧,咱们就写了一个工具。啊,Jdbc u艇是一个很通用的一个查询的工具类,它未来呢,你任何GDBC对吧?呃,任何查询都可以用这个工具类,就非常通用的一个工具类对吧?好,那这个写完之后呢,我们做了一个测试,发现呢,它这个效率并不高,所以我们在此基础上呢,做了一个优化。
13:08
对吧,引入这个red这种方式呢,叫旁路缓存,对吧?啊,我引入一个缓存,然后呢,我每次需要用数据的时候,我先到缓存里边去查。如果缓存有了,直接返回,如果缓存没有,我再到菲尼去查。查到的数据呢,给你写到这个缓存。然后呢,正常的去返回。对吧,在缓存当中呢,我们存这个热点数据啊,当然我们也分析了,这个缓存呢,有两种方向可以可供考虑,第一个就是对应内存,就当前程序里边你开一个内存空间啊,比如说你弄一个哈map,类似于这样子对吧?第二个点呢,就在于我们用独立缓存服务,比如说memory catch或者red啊这种,当然我们也对比了两种对吧,像对内存呢,这种它的效率特别高。啊,但是独立缓存服务呢,稳定性更好,扩展性啊更好,对吧,而且呢,嗯,可以适用于,假如说你这个数据要修有有修改。
14:10
需要去删除这个数据啊,类似于这样子的,诶呢,它反而更适合一些。对吧,它会更擅长一点,OK吧,所以呢,最后呢,我们学了,那补充了三个点,第一在查Phoenix之前,我们先查。如果有了直接返回了,对吧,好,那么第二。在读完Phoenix之后,将读到的数据呢写到这是第二个,第三件事,当维表数据发生更新以后。发生了更新以后,咱们怎么办?去把这个维表数据呢,把它删除。对吧,咱们做这三件事,而且这三个呢,我们单独都测了,但是没有结合着整个的需求来测啊,但是我们单独的起码这一块工具类我们都已经做过测试了,且业我们发现它读数据呢,已经降到一毫秒或者说零,对吧?啊,甚至在不到一毫秒,因为看到零嘛,它呢两个毫秒数是一样的。
15:06
对吧,啊,但是呢,可能后面的微秒纳秒肯定是不一样的,对吧,但是这个我们就没有精细到这种程度啊,我们就是认为诶,他可能是一个一毫秒00000到一毫秒9999,那我就认为它它既然显示的是零对吧,他肯定不超过一毫秒吧,对吧,我就打他是一毫秒得了呗。我就认为它是一毫秒,那能又能怎么样呢?对吧,比我们之前呃,从P读数据这种方式,就算你是用的同一个连接,对吧?呃,连续的访问同一条数据,效率也高很多。对吧,也已经高很多了啊呃,那其实到这一步为止呢,对于很多中小型公司就已经够了这个速度对吧,而且你要知道咱们还是用的虚拟机。对吧,咱们还用虚拟机,那你要真正的工作的时候用到的这个服务器呢。对吧,啊,那你那个带宽呢啊,那带宽可能跟我跟我那个没法比,带宽最高,呃,他没有说我们在Windows上装虚拟机,那也不一定,有可能是光纤入户对吧?哎,可能比这个。
16:10
我们这个访问速度更快,因为生产环境当中,它的一个是服务器,咱们呢是虚拟机对吧,所以对于很多的公司来说呢,到这一步就已经够了啊,但是呢,我们当时说了,我们考虑到有可能要做这个压测。对吧,考虑到未来公司的一个发展啊,那现阶段呢,是你应对个两三千。挺好的,我认为挺好的。对吧,啊,那你要是说。两三万。这个数据量。啊,其实两三万呢,也并不是说特别特别的高。对吧,那因为这种情况呢,好像不太合适了。对吧,啊,就不太合适了啊,所以呢,咱们就再进行一个优化啊,但是如果说你不能掌握的话,你可以说到这一步就够了,对吧?好。
我来说两句