00:00
因为当时我拿到这个题的时候,其实开始没太能想到那个,就最后内容刚才第二种啊,刚才第二种,但是我看到了,诶原题当中,哎,这个不是原题啊,原题呢。这个是,这个也不是原题,我看一下我放了,哎放了啊,这句话这个原题里面带。最后提到了什么producer Python加va也可以写代码的方式,当然我看到这句话之后,第二题呢,我开始想了,我第一种方案呢,给他说了,但是我觉得如果说在面试过程中,他可能会问,诶,假如说我连续十天等球对吧,我就给他快速的想了,另外一种方式就用买斯克的一个方式啊,不是买斯克,什么买斯克。MR的方式。用MR,因为它题目写了不仅限于什么搜狗这些东西,对吧,你就可以可以可以写代码的一个方式来做这个事。好,那无论是不是写在哪一个方式,我们都要干什么事呢?第一步都要过滤出来,这个没问题吧。我把数据集先过滤出来,这个总没问题吧,对吧,那个数据有了,然后我们还是基于这个数据集来写。
01:06
来写M啊,这个mmr呢,我把它放在最后。好吗?啊写MR,那写MR的时候,那你想想看,我们要对某一个用户。要求连续三天,那你告诉我reduce里边这个数据应该放的是哪些数据?首先这个数据集已经过滤出来了,大于100克,然后是2017年,这个你就不用考虑了,我们先提前过滤了,OK吧,然后再对这个数据集用MR怎考虑,那也就是说video这边你想一下你希望什么数据到一块来处理,你才能做到说把这个连续三天的数据给它过滤出来。假如说你一个人这个数据分散到不同的reduce方法里边,你有办法求连续三天吗?你是不是至少得把同一个人的数据都放在一块?
02:12
对吧,好,那我们就想着,那没问题啊,同一个人很简单嘛,T放什么你就在。对吧,用ID最后呢,他按照K排序,最后不进到一块啊,但是有一个问题,那这个时候你进到video方法,你能保证radio方法调用的时候数据是有序的。就是按照时间排号去的。那你把数据从迭代器里面拿出来,然后再去排序,是不是很麻烦,在内存当中,所以我希望这个数据过来是不是有序的。那我既希望我希望数据有序,而且是在对于同一个用户按照时间排好序吧,那也就是说map阶段。这个K应该是什么?是不是加上什么。
03:03
对。加上时间,那这个Y6呢。Y6你就不用管。你就把一行数据干嘛。我直接放在这儿,最后我只输出Y6就行了吗。对吧,哎,保留原始数据,因为他要的还是流水呀,我把整个流水直接放在这行行不行。啊,就这意思,好,那接下来问题来了,我如果说按照这个东西作为key,那reduce这边是我们想要的同一个reduce,同一个用户进到一个reduce方法吗?不好意思,不是你现在如果说你可以这样写了,你是不是一个用户加一个时间进到一个维修方法,这有没有问题。因为默认的它是不是按照K进行。分组了对吧,好现在,而且我们排序规则规定了,就得是一个用户,然后按照时间顺序。
04:00
排吧,按照时间上排,那怎么做?记得这个组件吗?Group compder。我是不是可以按照它进行排序,分组的时候不好意思,我只看就在利。还记得你们做那个用套了?他一的那个案例吗?还记得吗?排序用一个规则,我group comp呢,当时复习我让他按照什么user进行分组行不行,那这样是不是保证了我到一个reduce方法里边是一个什么东西啊。是同一个用户且按时间排好序的,有没有问题?没,没写这个这个group吗?没有,怎么可能没有呢?这个东西一个是排序规则,一个是分组规则,当我们没有自定义group comp的时候,它采用的是K的排序规则来进行什么分组,所以你们之前看到的是一个K进到一个V六次方了。
05:16
对吧,但是你加上group compel之后,你可以改变它的一个分组规则。排序是排序规则,分组是分组规则,也就是说我们要采用这个内容进行什么,把同一个用户放在一个video里边写它数据,还是按照时间干什么,还好去的,这是前提,上线好。现在呢,也就是说到了reduce这边,它是不是有一个迭代器。这个迭代器我们知道了,它里边的数据是按照时间排上去的,而且同一个迭代器里边一定是同一个用户的数据。对不对?好,有了这一步,我们下来讲核心代码的一个业务逻辑。整个方法因为是最核心的,取三天。啊,我在里面定义一个假如说呃,Int或者说是一个日期类吧,假如说因为里面日期在代码里面,是不是用它的类或者日期类来处理比较方便啊,我定一个DT啊,等于一个初始日期。
06:17
因为Y6,四在迭代的时候。在迭代器迭代的时候,第一条数据进来的时候。当第二条数据进来的时候,你还能看到第一条吗?看不到,但是第一条数据进来的时候,你能知道这条数据将来你要不要吗?就是2343条数据,假如连着的只有迭代器,你是不是只能先拿到二啊,拿到二的时候,你告诉我这条数据要还是不要。不知道了,不知道那怎么办,无选择性。不是无条件保留。得留着,得存下来,因为你不知道这条数要不要啊,我们的思路再开第一步,我在外面定一个DT等于一个初始值,随便你给零啊,给什么东西就是初始值,然后我对这个value斯进行什么。
07:03
迭代那肯定要主要的就是迭代它吧,好迭代它我就直接这样写的或循环,对吧,我应该写的是伪代码啊,代码在这里面干什么事呢?我们判断if。这个东西。是否等于它?如果说它等于它说明这条数据是第一条数据。那作为第一条数据无条件保留,保留哪呢?在外面定义一个。啊,随便是数组是集合无所谓对吧?啊用一个集合来保留啊,等于那我们干什么事呢?我们把当前的这个数据啊点艾。是不是迭代的时候是不是叫value,我无条件的保留这条数据,因为我不知道这条数据将来要不要第一步保留,第二步把DT。我外面不是定义两个得塔吗?对吧,我把这个得塔要制成当前的什么。
08:05
Y6.dt。因为我是要保证他是否第一条的判断第一条。好。这是第一条,是不是无条件加到集合里边。对吧,无条件加的结合好,然后把这个初始日期改成了当前这条数据的日期,当我们第二条数据进来的时候。这个东西满足吗?不满足,他应该走的是L逻辑。走的逻辑。第二条数进来的是不是同样的,我们想法也把第二条加到集合,你能随便加吗?第二条加到集合有前提条件,怎么做?如果说跟刚才这个贝塔相差一的话,我是不是加进去,如果说你都不相差一了,那你肯定跟前面不连续吧,还需要加吗?不需要,那这个时候呢,同时再做个判断,If。
09:06
当前的value。点DT,假如说我直接写减啊,当然这里边有日期内或者他内来操作啊,因为在代码里边嘛,我就直接写到伪代码,那减谁啊DT如果说它等于一的话,我们怎么做,如果不等于一的话,我们怎么做?等于一的时候是不是例子?是不是把这一步操作一下呀。又把时间重置一下吧,对吧,如果说它不等于一呢。清空吗?Continue吗?星空之前要做什么事?来注意这块呢,是要做一个判断if。List点。
10:00
如果说它大于等于三,说明什么问题?你刚才这条数据,假如说我们现在数据是2346。234我们看一下走的什么逻辑,二是不是走这个逻辑。三呢走它四呢走它,现在集合里边是不是有三条数据了。234是不是连续的对吧?好,那这个时候问题来了,当六进来的时候,是不是走这个逻辑。走这个逻辑的时候,你是不是判断一下当前集合里面是否超过三条数据?想一下。2346。当六进来的时候,是不是集合里面肯定存放了234,因为二是第一条数据是无条件放的。三是跟前面连续的,四又是跟前面连续的,当我们走到六的时候,他是不连续,不连续是不是走到这个逻辑。这个逻辑的时候,你说234直接清空不靠谱吧,你要干什么事啊,用context。
11:07
点right写出去吗?啊,写出去当然是对这个list进行便利,对吧,写出去之后干什么事?是不是这个时候去清空啊,对吧C对吧,完了之后无条件的把当前,因为你这个清空完了之后,这个六就相当于是第一条了啊。他又是一个开始吧,把六无条件的干什么?加进来,加进来之后把这个DT制成什么,当前六这条数据的。DT。啊,这个应该叫对塔对吧,好叫贝塔,我们的数据量叫贝塔。走这个逻辑。能不能理解这个问题?就是这一套逻辑能不能捋一下来我们捋一下啊,来看一下第一次呢,是我们定义了两个变量对吧?啊,一个作为初始时间,因为我们要用这个出入时间来判断它是否是第一条数据,因为第一条数据的时候是无条件保留的。
12:15
因为你不知道将来后面有没有跟他联系的吧,所以用一个标志位就相当于啊,然后用了一个集合。对吧?啊,用了一个集合来保留以往的数据,好,那我们按照这个思路走,对于这个负循环病例的时候,先判断这个DT是否等于原始数据,如果等于原数据说明什么?第一条数据。那就是无条件保留。因为第一条数据嘛,只能无条件保留,因为你不知道后面有没有好,这是第一条二走的逻辑,对吧?啊,假如说我们还是234623462组的,是不是这里面逻辑。好,那接下来三来了,你判断。
13:02
不成立吧,是不是总else?Else,再判断这个东西什么成立?三、是不是走这个逻辑。没问题吧?四、同理,是不是也走这个逻辑?好进来了,六进来的时候这个满足吗?不满足这个满足吗?跟四差二吧,不满足他呢,只能走这个L吧,走这个L的时候,你要注意此时集合当中有三条还是没有三条,你知道吗。你不知道你是不是要判断一下呀,如果说它大于等于三乘。那就说明这个集合里面的东西已经满足了前面连续的了啊,假如说这里面是不是可能出现这种情况,2345这边出现八是不是有四条啊,对吧,因为二是第一条,345都走这个逻辑对吧?啊,那八来了是不是做一个清空对吧,清空之前你一定要判断一下吧。啊,做一个判断。啊,这个发票好,如果说他每到三条呢。
14:03
是不是把它拿来。是不是不用写了?因为你没有三条的时候,说明你前面满足我们条件吗?不满足吧,哎,不满足我直接干什么清空,然后把这个写进去了。啊,那是这个整个业务逻辑到这就结束了。所有情况我们都考虑到了吗?我举个例子,我几个数据你看一下啊,能不能想起来。
15:02
假设数据现在是1月2号,1月3号,1月4号,1月6号,1月7号,1月8号,最后这六条数据是不是都要写出去?你看一下,按照我们现在写的逻辑。能写出去吗?四肯定没问题,七八能写。没有酒精。你看六是不是走这个逻辑,七走哪个逻辑,走这个,八呢走这个。没了,有人写吗?写在这儿。是不是678不可能写出去啊,所以我们漏的就漏,最后一步判断在这个负循环的外面再来判断什么。如果说最后一次它的长度还超过三,这个两个就不了吧。清空,甚至都不要了。对吧,能理解这个事儿。
16:05
最后还要写出句子。能想明白这个问题吗?就是我们刚才举的例子嘛,234678,那你看啊二呢走。第一条数据逻辑加到集合没问题吧,好,它呢走跟上一条连续逻辑,加到集合四走上一条连续逻辑加速集合六呢走跟上一条不连续逻辑,然后判断。是否大于等于三,是不是234在这个时候输出输出再把六加到集合七走三四一样的逻辑吧,是不是在这,然后八呢走这。走完了就完了呀。有九来出发,他这个写吗?没有没有下面一行,因为最后一行,最后一行出去是不是整个分循环结束了呀,结束之后那678是不是就得集合一个有人写出去吧,没有啊,所以最后我们应该加一个什么。
17:01
就负循环外面再判断一下当前集合是否大于三对吧?哎,如果说它最后大于等于三,也就说明这个数据啊,在最后几天是什么。是连续的对吧,哎,我们最后呢,再干什么,写出去一次,能不能理解这个事。6789。那九也是一样的逻辑,也是要在这写啊。对吧,九还是走这个逻辑写进去了,你再来一个十,不是还同样道理吗?对吧,只要连续最后几次,只要是连续的,它都只会加到集合里面,它不会触发他的一个写操作是不是啊,对吧?因为写操作逻辑在于哪呢?写操作在它不等的时候,在这个里面吧,因为你六七八九十这个都是相都是相邻的对吧,相邻的就不会写啊,就不会写这个意思。
18:00
啊,因为相邻的不可能写吗?你写出去,我下一条假如还是相邻的怎么办呢?对吧?啊,所以说相邻的就不写,相邻的不写,等着最后写吧,啊这个逻辑不要漏了,所以呢,你把234678这个数据一看,大部分同学呢,应该能理会到,就最后678,实际上按照我们之前所写的业务逻辑是写不出去的,对吧,最后也就是说做一个什么收尾工作啊,确保最后几条数据也要写出去。对吧,你自己按照这个逻辑,然后干什么呢?你举例子234对吧,六七你这样举,然后呢,你举例子234678,你往里边带。啊,往里面带去看一下,去看一下最核心的业务逻辑是他啊,就是对于这个value的一个。病例啊,在这里边做一个病例啊,这个这个东西。嗯。
我来说两句