00:00
啊,这流程什么样的呢?呃,从我们现在这业务拿数据,然后接下来到达卡不卡,然后呢,我现在读取我订单的一个数据,然后接下来,那么咱们现在呢,要判断是否为首单,那么判断是为首单的话,咱们怎么判断的呢?那这里我们呀,用到了我们这个啊h base,就这个数据呢,咱们是从h base来查查的啊,就我现在把用户的状态保存到h base里边来,然后从h base里边呢,把咱们这个用户的这个状态给查到,然后查完之后呢,咱们是不是还把这状态更新回去了,对吧?但其实目前呢,这里有一个bug。就是功能呢,咱不往下做了,在这里面有一个bug,咱们得解决一下。能想到吗,同学们。就是咱们整个啊,在咱们处理的时候啊,其实这里呢,有一个bug存在,看一看能不能想到。这个具体bug在哪一块呢?那么大家想一想啊,咱们现在其实一共做了我们就三部分功能,那先来看第一块功能,你们觉得从卡卡里面主题读取数据这块可能出bug的几率大不大不大,基本上咱们现在可以把这个bug给pass掉,说不可能出在这。
01:24
对吧,因为咱们现在这里是不是用了好多次了呀,对吧,然后呢,那这块这个出击率都大不大呢,就是我现在在保存状态的时候,这个东西好像也不太大,因为这里边这个代码咱们在搞定的时候,再在在研究时候,那这无非就是往这里边保保存数据嘛,而且咱们也可以看到这个保存的结果,对吧?所以这块呢,出理的几率也不太大,那所以说呢,咱们现在那么如果说要是出问题的话,那可能就在哪呢?是不是应该就在我们现在这个判断是否为首单那块呀。这会有八个对吧,那这个什么问题呢。
02:01
想想班长。嗯。现在班长有什么特点是不是?你说白有什么特点,你们都笑什么是不是?来大家想一想啊,咱们现在在判断是否为首单的时候,你不管用哪种方式,对吧,咱们是不是当前这一个采集周期,来这个数据进行判断呀,对吧?那班长的特点什么呢?快吗?对吧?那有没有可能是这种情况,我现在在五秒钟采集周期之内,班长下了两单。对,而且以前班长从来没在这个网站上消费过。
03:02
啊,有没有可能出现这种情况,一般人不行是吧,但如果特别快的人是不是也可以的?大家想想,那如果这样的话,咱们会出现这种情况,是不是我现在这两单是不是都统计为首单首单了呀,对吧,就是假如说我现在啊,这一个采集周期的,然后一个用户对吧?然后呢,下两单,那以前呢,从来没有在咱们这网站消费过,那么他是不是认为咱们当前这两单是不是都是首单呀,那你在做首单统计的这数据数据不准的呀,对吧?所以说呢,咱们要对他做一个处理啊来什么呢?呃,一个采集周期啊,它这个状态的更正对吧?那么这个是漏洞对吧,你可以定行bug对吧,就说我现在呢,咱们一个用户啊,如果是首次收费,那么在一个采周期里边,这个用户下两单,那么这个时候呢,就会都统计为首单,那么怎么去解决呢?对吧,大概解决思路是这样的,首先第一个啊,那么应该将同一个采集周期的同一个用户的最早的订单标记为首单,其他的对吧,都改为非首单,这这是我想要的最终效果啊,这是我想要的最终效果。
04:02
对吧?那具体怎么做呢?那大家想一想,同一个采集周期,同一个用户如果下了多单的话,咱们是不是应该把咱们当前的用户放到一组里边去啊,对吧?那么如果放一组的话,那你是得按照用户分组啊,这是第一步,那么第二步,那么如果说当前的用户下了多单,那么咱们是不是保留我们第一次下的单为首单,那么最后的是不是都是非首单呀?那你怎么知道第一次第二次你是不是得按照订单的时间来做个排序啊,对吧?然后接来排完序之后对吧?那么你把这个最早的给拿出来,对吧,然后接下来,那么咱们现在就可以对吧?哎,把这个最早的标局手单,其他的标局手段飞出来了,大概的咱们思路呢是这样的啊,大概的思路这样来,那么咱们现在呢,再往下走,注意啊,同学们我在写代码的时候呀,那我现在按照123这个步骤来写的,但是呢,我现在真正我在执行的时候,对吧,那么这块呢,我有可能啊,我第四个做的这个业务并不是在最后边。
05:00
因为我现在如果说想维护咱们这个这个采集周期的状态的话,我是不是应该在咱保存之前来维护啊,对吧,所以说呢,那这块呢,算是我第四部分内容注意啊,这会儿算是我下午带他做的第四部分的一个内容啊,干什么呢?同一批次采集状态啊,同一个采集周期中它的一个我们的状态的修正,对吧,这咱第四个功能。同一批次种。它的一个状态,它的一个修正,大概的思路啊,是这样啊,大概的思路是这样的是吧,那么咱来看一看这个代码怎么来写。这个代码应该怎么样写?同一批次中,对吧,状态它的一个修正对吧?那么大家想一想,首先第一个咱们是要把当前这个批次的所有用户对吧?这个按照咱们的用户放在一组啊,对吧?那么如果按照用户放的一组的话,那首先咱们是不是得对结构进行转换,首先呢,对我们这个待处理的数据来进行一个结构的一个转换啊,那怎么转换呢?咱们现在这里面放的是什么?大家看是不是还是我们的订单呀,我当前这里放的是不是还是订单对吧?那么我现在呢,那要想按照用户分组对吧?那我希望啊,那转换的应该是user ID,然后以及当前这个用户他所下的订单对吧?那目前咱们现在呢,是我们这个订单,所以说呢,我要把它转成电子结构啊,转这结构,那咱们是不是可以通过一个map克来转换呀,对吧?那么你现在给我传的这个参数是我们这个order in for,然后接下来那我现在返回什么呢?我返回一个元组对吧?我返回元组,那么这个元组呢,一个是我们的order in for点。
06:56
我user ID,那么另外一个呢,是我们order info本身对吧,然后接下来点二,那么现在呢,他拿到的是一个对吧,这个map吧,就执行完map之后,对吧,那个Dis stream好了,那这样的话,咱们现在啊,已经啊把这个用户的ID,还有咱们当前的用户的下单对吧,这个结构给拿到了,那么接下来,那么咱们现在这里再往下走干什么了,是不是得按照我们的用户的ID来进行分组啊,对吧,那接下来第二件事啊,那么咱现在呢,要根据我们的用户的ID来对我的数据呢,来进行一个我们这个分组,那怎么分组呢?Map stream点,那么咱们现在这里是不是可以通过group by k是不是就可以啊对吧,按照K来对数据呢进行分组啊,咱们同一个用户啊,所下的单可们都放在一个组里边来进行处理,对吧,那么这个呢,是我们的。
07:56
Grow by key stream啊,Grow by stream,然后接下来那么分完组之后,咱们是不是得对分组之后的数据来做一个处理啊,对吧?那么大家想一想,你现在呢,这里边的数据应该是这样的,对吧?比如说张三这个用户,然后他这个里边呢,放了多少个订单,然后李四这个用户,它里边呢,放了多少订单,现在数据是不是这样的呀,这个数据是这种形式,那么咱们最终我要干什么,我最终是不是得把这个订单一个一个的给拿出来呀?
08:26
对吧,你说咱们最终其实我在统计订单的时候,我其实这个东西对我来说没有太大意义,对吧,我现在肯定要把这个订单一个拿出来,但是现在订单放在哪呢?放在一个迭代器里边了,放在集合里边了,对吧?所以说呢,那我最终我要想要一个个的,但是你现在这个整体,我是不是得把这整体给拆成一个个体啊,所以说呢,咱们想把整体拆分一个个体,咱们用什么算子合适呢?来把整体给填成一个个体,那么这个咱们用什么Fla map就可以,这个flag map对应的算子是什么?
09:01
和咱们这个Fla map这个算对应的,它是把整体给拆成一个个体,那么有没有把咱们现在对吧,这个个体合并成一个分区的,是不是有一个叫lo呀,对吧?是不是一个叫glo的算子对吧?来,那咱们现在呢在这啊,那么你现在呢做map,那么如果Fla map的话,那这里应该拿两个东西对吧,咱们匹配一下,一个是谁呢?一个是我的user ID,那么另外一个看在是我们这个order info1TR对吧?Order info订单当前这个用户啊,他订单的一个这个迭代器对吧?那么最终咱们要返回谁呢?咱们是不是可以返回一个order info迭代器,因为它这是一个Fla map嘛,你到时候肯定得给我返回一个叠这个可迭代的集合回去,那么咱们现在在这里啊,同学们,那我们说了说什么呢?对迭代器进行操作呀,那么我的习惯是不是把它转换成集合性操作更方便一点,对,因为迭代器迭代一次是不是就没了呀,所以说呢,那我现在在这里把它呢,去做一个转换,转一个list的。
10:01
然后接下来点V2,这个是ordervo list,我问大家这是谁的什说某一个用户的,然后接下来在咱们当前这一个批次中,它所下的订单的一个集合呀,对吧?那么咱们现在可以干什么呢?我来判断一下是吧,判断在一个采集周期,用户是否下了多单,用户是否下了多个订单,怎么判断呢?怎么判断利用是不是下了多个订单呀,看集合的个数呗,对吧?如果说我当前啊,在这做个判断啊,如果说咱们当前啊,它的一个粒子集合是吧?那不等于空,那不等于空,那么并且呢,咱们这个order for粒子集合,它的一个size如果要是大于一的话,那说明什么?
11:01
什么同学是不是下了多单呀,那么如果说我现在呢,不大于一,比如就等于一了,等到这个时候,那大家想一想是不是就相当于,因为正常情况下,这个其实不会等于空的啊,应该不会等于空的,对吧?那咱们现在如果正常情况下,那咱们现在拿到的是不是应该就一个呀,如果一个的话,那你说我还需要做什么状态的更正吗?不需要,不需要的话,那咱们是不是直接可以从我当前那个集合里边,对吧?拿过来数据直接给它返回就可以了吧,对吧,直接出,那么否则的话,那么这里呢,那你想对个集额进行操作,或者说我现在直接拿整体,是不是把这个集合给他也可以,对于Fla map嘛,对吧,你不一定非得转我转成迭代器,咱们这个拿返回金额是不是也可以对吧,你如果说只有一个的话,同学们你这边金额给我拿过来就行,那么如果说我现在下做订单的话,那怎么办?咱们是不是得对我这个订单按照我这个时间来进行排序啊。能跟着思路吗?同学们,那跟着思路是跟着思路,如果说啊,那么咱们现在是吧,如果下了多个订单啊,下了多个订单,那么我需要按照什么呢?按照我们的订单下单时间吧,按照我们的下单时间升学员教学。
12:17
我现在想保留第一个订单,他是我们的首单,其他的呢,都是我分手单,咱升序的教学升序是吧,诶按照下单时间来升序排序啊,那么现在呢,来再往下走,那么再往下走的话呢,那这里如果下了多个订单的话,咱们呢,要按照下单时间呢来升序排序排序的话,同学们。怎么看so什么so半行不行,别忘了,我现在不是我的FD,我现在是集合。对吧,那么如果集合排序的话,那应该有三种方式吧。一个是thought by,一个呢是我们这个thought with,对吧,还有一个呢,对吧,来看一看是不是还有一个这个thoughtted呀,对吧?那么咱们其实在用的时候,是不是这两个用的这so with是不是更灵活一点,对吧?那么如果south with的话,那么这个时候呢,那应该是不是两个参数啊,一个呢是我们order in for1,另外一个呢是order in for2,然后接下来那么咱们排序规则,那应该是order INF for点我们现在呢是不创建时间嘛,Great time,然后按照升序排序的话,那这里应该是。
13:29
小于我们那个order in for2啊找谁呢?点我们可以排对吧,排序完事了,那么排序之后他得到的什么,他得到的是一个sort a的对吧,List就已经啊对当前的这个订单排完序了啊或者sort的inport离子吧,Allport is对吧,这个呢是已经排好序的,它的一个订单集合啊,In序订单集合,那接下来那么咱们现在排序取最早对吧?来在这里怎么取最早。
14:03
零呗啊,我现在就得第一个元素,听不清是我现在最早吗?对吧,所以说那我现在呢,在这里对吧,拍下去之后干什么,我现在要取出我们集合中的第一个元素啊,取出集合中它的第一个元素是吧?那么取完第一元素之后呢,咱们要拿它的一个什么呢?要是不是得判断一下啊,同学们判断什么,判断它是不是我们这个is first order。看是不是首单啊,判断是不是首单,想一想啊,那么我现在呢,在这里如果说啊,如果说对吧,那么你拿到咱们当前的这个第低域元素,它等于等于零的话,那如果说你当前拿到这东西等于零的话,你还有必要去改的吗?没必要,为什么,因为就算是你在当前,在同一个采集周期里边,你下了多个订单,你原来已经消费过了。
15:00
对吧,只要是你看,只要是咱们现在零,那意味着什么?意味着你原来已经下过订单了,你前你曾经消费过咱们当前这批次的,那是不是还是不是收单呀,是零单数不需要改,那么如果是一的话,那这个时候说明什么?说明啊,咱们原来没有消费过对吧?那么他把咱当前这采集周期的所有数据对吧,都给它置为我们这个一了,那不行对吧?所以说我现在判断一下,如果说我当前接入第一个元素,那么是一的话,那后边的肯定也是一。这个能理解吗?就如果说我现在提高低于元素之一的话,那说明我现在从咱们菲尼X里边肯定是没有查到我的消费状态的,对吧?那如果没有查到的话,他会认为我当前这批次下的所有订单他都是我首单,那么如果都是首单的话,他会把咱们当前这批次的所有订单的数据都给我标记为一,对吧?那咱们现在在这里同学们想一想,那如果说啊,这个东西它是一的话,咱们第一个订单我是不是一的状态还得保留啊,那我现在干什么呢?对吧?就是说时间最早的,时间最早的订单对吧?它的一个首单状态保留为一啊,他的一个首单放单保留为一,是首单,那么其他的都设置为零,都是非首单了,对吧?都设置为零啊,非首单。
16:25
想想这个代码应该怎么写?这块的代码应该怎么来写?把其他的都设置为分数的,那这种代码应该怎么来写呢?循环是吧?循环谁循环这个循环这个,然后进来取谁取它的一个长度是吗?对吧?它的一个S子,然后进下来,咱们现在呢,在这里放循环来取它的一个我们的一个长度,那么这个长度呢,那应该是从零开始,然后to对吧,然后到它的一个长度对吧?然后咱现在呢,在这里给它复制一个我们这个变量,然后进来是吧?然后咱现在呢,是不是可以把thirty eight的in four list,咱们这个赋值个变量就是道写成A了啊,这该是A对吧?然后把这个A它的值赋值给谁呢?赋值我们这个。
17:24
明白啊啊。有问题是吧,因为从一开始对吧,从一开始然后呢,就没问题了吗?啊S减一,注意啊,同学们,咱们现在在这里,如果你要想去把这个集合剩下的元素打过来,对吧?那么你是不是在这里,你第一个元素是不是不需要改啊,那咱们就不能从零开始,因为咱们现在这个零,我是不是还得保留一的状态呀,对吧?那你要从第二元素开始,是不是应该是所以从一开始的呀,对吧?那么另外一个,咱们假如说集合中有五个元素,那么它最后一个元素下标是不是应该是四呀,对吧?所以说呢,这块你要吐的话应该减一,或者是那现在不用to理方法说咱们现在有一个是吧,什么until是吧,对吧,有个until用它也行对吧,用它也行对吧,然后进在咱们现在呢,把这个东西给它追零对吧,然后咱们最后呢,把我们的stock in for list给它返回回去,对吧,那这个呢,是关于我们的状态它的一个修正。
18:29
啊,关于状态修正看一看啊,今天的代码和咱们那个前两天比起来,是不是要稍微的有那么意思一点点呀。
我来说两句