00:00
好,那接下来还有一个点。在于什么呢,这个。啊,就是他。我们要对他也要做一个。额外的说明,因为前面需求上写了对吧?啊,文档应该没有校验好啊,这边写了写了,那我们就按照这个来,按照这个来好吧,呃,那也就是说订单数,那么就是订单正常的来一个我就加一个呗,因为SKU我们的订单明细对吧?下单表相当于是订单明细。跟着订单明细ID走的对吧,然后呢,我们SKU。ID也是跟着订单明细ID走的。对吧,啊,那不是有的公司呢,可能会出现这种情况。啊,注意啊,我们呢。凹的。一个订单。好吧,里面呢有SKU对吧,有不同的SKU,这是正常的,比如说买了电脑买了鼠标没毛病吧啊,然后有同学说买了电,买了电脑一个一台对吧,鼠标两个啊乘以二啊没问题1001。
01:11
1002对吧,这个呢,一这个二这是SKU number嘛,对吧?啊价格类似于这样的,那这个是正常的一个订单对吧,没毛病的啊,那现在呢,有的公司啊,我说的是有的公司,不是全部的公司,他可能会这样啊,我们考虑到情况更全一点,对吧?把这个功能加上它不会有错啊,什么功能呢,比如说这样。他还是一个凹的,但是呢,他又他买了商品对吧,他买了什么商品呢?1001,诶1001。不过他们参与的活动可能不太一样,对吧?啊,它是A1活动,它是A2活动,因为有的时候满减,有的时候是打折对吧,你会算钱的时候,你发现诶参与满减比较划算,或者参与打折比较划算。叭,比如说吧,比如说这样啊呃。
02:02
当然有的公司他不允许这样操作,有的有的平台是可以的,对吧,比如说现在呢,有两个活动,一个呢打九折。九折活动,呃,还有一个呢,是满200。减30。他有两个活动。可以吗?啊,比如说啊,他有这么两个活动。啊好,那假如说我买的东西啊,嗯,一件刚好100块钱,一件100块钱。对吧,他一件100我买我我要三件,我要三件。你选下面的是吗。不不不不这样,你看啊,你要买三件啊,那我怎么办呢,我呢两件走这个活动。一键走这个活动。能明白吗?诶,那也就是说这个商品呢,我可能买了一件对吧,A1我参与了A1活动第一个活动对吧,这个呢,我买了两件,我参与第二个活动,那这样既然这样的话,你参与的活动不一样,是不是他有可能就拆成了两个订单明细,但是这一件商品注意啊,这是SKD。
03:14
这个是SKID对吧,这个地方呢,是我们的SKUID,那我们同一个SKID是不是属于同一个订单数里边的。你求订单总金额没关系,对吧,你可以单独的做这个累加没关系。这个无所谓对吧,你直接做累加好了啊,但是我们要求订单数呢。你说我们这个地方应该要多加一个什么事了。我们要干嘛?如果说我们要求的是订单数,对吧,对了,就像姚总所说,我们很明显这个地方呢要做去重。
04:11
咱们要做这个去重对吧,呃,根据订单D做去重啊,咱们要根据这个订单ID做这个驱虫。对吧,咱们要做这个驱虫啊好。那这个曲轴应该怎么做呢?想一想。我们应该怎么做这个地方的驱虫呢?
05:05
要怎么去虫,大家想一想。带密等的。集合。O。直接就一步到位了呀,其实我们刚开始想到还是一样的,用这个状态编程做它的一个什么。驱虫吧。对不对,我们刚开始想的应该是用就正常的,我们用状态编程嘛,对吧,做它的一个驱虫就好了。是不是根据这个SQID。啊,分组可不可以啊,这个驱动大家总会吧,对吧,把这个相同的,呃,就是来了之后发现凹的ID以前有了,那我订单数就记为零,如果之前没有,那么就记为一对吧,相同的这个订单没有出现过,那我就记为一对吧,也可以。
06:09
还是分析分析来的好。对呀,我给你分析嘛,就首先。我们是不是想到用状态编程啊?对吧,因为一就目前来说,我觉得对于大部分同学啊,一路听课听下来的同学,对吧,一提到系统是不是自然而然的能反映到用专态编程这个有没有毛病。这个应该要能反应过来啊,要用状态编程来做各种各样的驱虫操作,有没有问题。对吧,那这个需求可不可以呢?是不是也可以啊。修理也可以。对吧,咱们完全也可以用这个状态编程来做这个事情吧,但是呢,我们仔细想它会比较麻烦一点啊,为什么呢,你想啊。它是根据肯定是根据SKUID。
07:03
啊,分组。对不对,我们要去重这个。All的ID啊,根据SQID加all的ID进行分组,可不可以?我根据SQID加上凹的ID。进行分组,因为我们要的并不是对订单ID单独的去动,也不是说对SQID去重,而是要两个组合在一块儿,一样的去重掉,对吧,所以呢,根据它俩做去重,然后搞一个什么状态,如果状态等于none,那我再因为这些东西我要转化数据结构啊。对吧,我要转成数据结构,我要去分组聚合,然后呢,再去关联为表,对吧?所以我要转成数据结构,那转换数据结构的时候呢,如果你状态等于none,那我怎么样,这个即为一,如果你状态不等于呢?那怎么样,这个即为零,能明白吗?
08:03
能不能明白?就还是跟之前一样,对吧,我搞一个变量是不是有时候等于一,有时候等于零,就看这个之前有没有数据来。没毛病吧?啊,那这是用状态编程好,那其实这个地方呢,我们这个方案我就不写了啊,这个可以你要自己想写,你自己写一写,因为前面我们去重其实都采用的是这个状态编程的方式,对吧,那这个需求反而我们可以用另外的编程编程方式啊怎么做呢?原因是在于啊这个订单数。它呢是聚合之后的一个结果,也就是说它是十秒钟。按照SQID对吧,分组十秒聚合的一个什么结果数据,大家想是不是。
09:00
对吧,好,那。我能怎么做呢?我可以。不直接对于数据整体进行驱动。啊,我做什么事,我直接按照。我把这个订单ID保存下来,你不是按照这个SQID分组嘛,对吧,就像刚才那个姚总所说对吧,呃,我把这个订单ID啊放在一个。Set里边。我把订单ID放在一个set里边。放在一个哈赛里面。对吧,那接下来有什么好处呢?我们接下来是要按照SQID分组做聚合的。那我做聚合的时候,我能不能把所有的set把它聚合到一起。最后呢,取出当前这个set的。大小。
10:00
把它取出来。对吧,我取出当前set的大小,那是不是就是我们的定单数,这就所谓的带幂等性的集合,所谓带幂等性呢?我们写了多个,它会自动去重吧。对吧,因为这个驱虫跟我们以前驱虫不一样的地方在哪,它是对于有限级进行驱虫,你有没有发现。它是每十秒一个窗口做一次驱虫,每十秒一个窗口做一次驱虫。咱们能不能说在封装招聘的时候,我把订单ID写到这个集合里边。对吧,最后聚合的时候,我把多个集合聚合到一起。因为它是有限的,它不是整体,如果这个需求啊不开窗,那你就只能用第一种方案了,对吧,用状态编程来做驱虫这个第二种方案去重的方案,大家。有没有听懂?
11:00
这个不是说随时都可以用啊,它的一个点是在于什么呢?我们现在是对于窗口的操作,这种有限数据集所做的一个操作,对吧,才可以这样玩,如果不是那种,如果说你像之前的那种,对吧,你今天早上跟今天下午可能有数据之间有重复了,我要去找,那不好意思,你用状态编程吧,你这个集合就不太好用了。对吧,现在的问题是我们要开窗,而且我们是要对窗口里边的内容做驱动,对吧,所以呢,我完全可以做这个。嗯,不是OM,不是OM,如果你不开窗,你多条数据,不用状态编程,你怎么能见面呢?能能明白吗?就是你你搞个及格,你及格是什么东西呢。你你比如说你第一条数据里边搞个集合,第二条数据里边搞个集合,这两个集合能见面吗。
12:02
他合并不了啊,你最后不开窗的话,他合并不了,你想能明白吗?是不是他压根就合并不了。对吧,啊啊是这样一个点,好,那有同学说是不是前面,那前面其实我操作都有开窗啊,那为什么没有用啊,注意这个是对窗口内部的一个点做驱动,因为你要知道。我们刚才说的驱虫的主见是什么?是这个订单ID。和SKUID。对吧?我要去重的主见是它俩得相同才可以。啊。订单ID跟SQID相同才可以,对吧,也有同一个订单里边,对于同一件商品啊,我参与了不同活动或者什么样子,对吧,其实这种这样做的公司比较少,但是我们呢,把这个加上,那这是复杂的嘛,要不然你就不用去弄,直接累加一就跟那个金额一样的做法就行了,对吧?好呃,那我要根据它进行去重,对吧?而而且开窗就可以做这个事儿,那其实还有一个前提条件,不光是开窗,还有一个条件是什么呢?我们这两个相同的。
13:16
我能保证它一定在同一个窗口。对吧,你像之前我们按照m mid去融,或者按照UID去融,你能保证相同的UID在一个窗口吗?不是吧,所以没办法用,对不对?而现在按照订单ID以及SQID分组,我能保证它的同一个窗口,为什么?为什么这两个相同的啊,它一定在同一个窗口,为什么。
14:01
对,他是什么?订单ID要相同对吧?订单ID要相同,OK,那既然你订单ID相同,那同时生成呢,你的事件时间一样,而我们是根据事件时间开的窗口,且设置了乱序程度,对了,就是时间事件,事件时间完全一样,对吧?所以我能保证的是。这个数据相同的,它在一个窗口里边,我能保证这个事情,我只要能保证这个事情,我就能用刚才我们那种训练方案搞一个set,到开窗聚合的时候再。合并。得到这个值,得到这个订单数,OK吧,所以这种驱动方案呢,它并不是通用的。而是针对于特殊情况的一种。能懂吧,啊,它是要有前提条件的,但是我们所说的状态编程是没有前提条件的,而我们写过太多的这个状态编程去重的方案的,所以呢,我就不写了,好吧,因为以前都是这样写的,都是用状态编程写的太多了,那这个地方呢,换一下我们在招聘里边搞一个这个什么set。
15:12
对吧,好,那这些点就是我们当前这个程序跟之前不同的地方。懂吧,有几个点啊,第一我们需要关联为表,而且我们分析了,我们先。合并数,你说的是哪个摩吗?你说的是replacing?Re。树。对吧,Replacing什么。
16:02
这个其实还不一样。不一样,不一样。那个就是人家有密德信。人家做驱虫就根据一个主件给他去重掉嘛,然后你在同一个同一个分区内部去重掉,还是不太一样的,不太一样的。好,那我们总结一下当前这个需求与其他需求的不同点。第一个关联为表。对吧,第一个点是关联微表啊,而且呢,我们发现到我们要关联的这些信息,其实不会影响到分组。是不是它并不会影响到分组,所以呢,咱们可以先分组开窗聚合,然后再去关联位表,因为效率更高,因为你在聚合以后,数据量就降下来了,所以效率会提高。对吧,这是第一点不同的啊,第二就是他这个招聘的字段特别多,而且在聚合之前,绝大部分的字段都给不了,所以刚开始我们在封装招聘的时候呢,有很多字段都没办法去写,我们只能空着,那这样空着呢就会比较麻烦,不好看,对吧,很长啊,所以呢,我们用一个构造者设计模式。
17:23
来完成这个招聘的一个书写。对吧,这是第二个。呃,那么第三点,就刚才我们说的这个情况比较特殊啊,我们家的一种处理方案就是订单数对吧,其实后来呢,他好像写的那个,呃,都没有了这个东西,那没关系啊,我们把这个加回来了对吧?好,那就是有了这个订单数这样的东西。而我们给大家分析,有的公司呢,他可能在一个订单里边可能会出现。多个相同的SKD,但实际上这种公司比较少,但是呢,有既然有了,我们要把这个考虑进去,我们考虑最复杂的情况嘛,因为如果不考虑这种情况,那就来一个累,写个一,来一个写个一就行了,对吧,按照SKD分组,那就一累加就行了呗,对吧,这就比较简单了,当然我们考虑这个要做去重,驱重呢,两种方案,第一状态编程做驱重,对吧,这是我们最常规的方案,因为我们一直都是这样用的。第二个就是我们说的,由于它是对于这个有限数据集进行驱重。
18:26
所以我们可以搞一个集合。来做它的一个去重,在聚合的时候最终做一次驱虫。对吧,啊这个意思好,这是我们所说的跟其他需求的一个。不同点OK吧?
我来说两句