00:00
好,接下来呢,我们来写一下reducer哈,那定一个类对吧,定一个类需要它继承。对应的reducer。那定义reducer的时候要注意这里面这个包反复强调这个导包,哎,对于初学者来说啊,这个导包呢,是一个难点啊,要仔细认真,那我们导这个reduce的啊。到它然后呢,里面对应的有泛型。那发型仍然是key in value in key out value out,对吧,好像跟我们这个map的有点类似。我把它拿过来。修改一下。好修改一下,那第一个呢,就是这就变成reduce呗。那这个呢,也是reduce。那看一下这对应的这个key in和Y6IN,它是什么类型。咱们说呀,Map的输出是reduce的输入,对吧,那也是它的一个输入,那输入map的输出什么类型呢?是test和那好,那这块呢,就应该是。
01:11
Past。那下一个呢,就是。好,那最终的这个key out和value out是什么类型,那仍然是。Test和R方对吧,啊test啊没问题,那把这个写一下。Test,诶test的也不要导书包了,你看他默认的给你导的什么啊,XL这个啊,往下找找他啊,一定要找他。你把这个导包要克服过去之后,那注意你们初学者来说啊,这块呢,就不是什么大问题哈,呃,Initable。搞定。那再来test。In that,哎,瞅一眼,瞅一眼之后呢,再往下写就肯定没问题。接的这个呢,是泛型也搞定了,那接下来呢,我们仍然是进入到这个radioer里面,看一看这里的源码到底长什么样,对不对,首先进来的仍然看到的是上下文contest。
02:07
它是连接map reducer,以及呢,跟系统的代码进行一个交互的一个桥梁,通过它进行来传递相关的一些消息啊。那往下看,Setup reduce clearup,直奔主题,仍然是看这个。Run,哎,这个run方法一进来呢是setup,然后看末尾呢,Finally是click,啊,那很显然这是初始化,这是呢,诶,结束任务之后进行关闭资源的一些相关处理,那中间这个位置呢,是reduce的核心业务逻辑,比如说在reduce阶段你到底要干什么事?哎,是这个意思哈,那行,我们来看一下这个往上走32吧。叫ones and start of the task就是在任务开始的时候进行一个初始化。结束cleanup仍然是called ones对吧?哎,这个程序结束之后进行一些收尾工作,关闭连接呀,哎等等。
03:05
Reduce方法,核心方法说,This method is called for each,所以说每一个会被调用一次。然后most applications will DeFine their reduce by overriding this method,比如说要复写这个reduce方法好。那这是什么含义呢?什么意思叫this method is called one for each key,比如说每一种key。会被调用一次,那举个例子,我这里面这是一个at的空间吗?这是艾特硅谷,艾特谷是不是有两个单词啊?那这两个单词经过map计算之后,会切割成艾特硅谷。然后一对吧,然后艾特硅谷。一。那它进入到reduce方法里面会变成什么样呢?它会变成硅谷。然后这是作为P对吧,啊就是为K,然后Y6类型的是一一。
04:03
哎,这样去处理,你说把它们处理成这样。啊,那后续呢,你可以对结尾这些数据进行累加啊,或者加减乘除相关的操作都可以。好,这是相关的一个方法啊,那回来我们自己来写一下。业务逻辑,哎,打一个re对吧,Reduce直接复写方法,把它负类干掉,干掉之后那看好了啊,看它reduce的一个输入参数对应的是K和它,它是一个什么鬼。哎,那我这个K谁啊,K是对应的你这个reduce输入的K,那Y流丝呢,是对应的你reduce的一个输入的Y流输入的值,那这个是不是一个迭代器呢。同学说它是一个迭代器啊,其实它不是一个迭代器啊,如果它是一个迭代器的话,迭代器有什么特点呢?它应该有has n对吧?哎,没有对不对,或者有什么nice的也没有,它不是迭代器。那他说不是迭代器,那它是什么呢?它是一个类似于集合啊,集合的老祖宗啊,我们来看一下啊,比如说。
05:09
A2A。List。打开,那这是一个list,那list它继承了一个抽象的list,好点开抽象的list又继承了一个它抽象的集合,那抽象的集合又实现了一个collection集合接口。好,那我点开集合。集合继承了谁呀,继承了这个able。啊继承它,所以说它是类似于一个集合。好,那回来啊,它类似一个集合,那它跟迭代器有什么关系呢。好艾看到吗?哎,我打一个艾特瑞之后,你看at ne就有了吧,哎,然后next是不都有了,哎,也就说我你想要它对应便利的话,你可以先获取它的迭代器,然后进行后续的一个操作,这是可以的,那当然我们不用这么麻烦啊,我们可以怎么处理呢?可以循环。
06:00
哎,增强for循环的方式,点for。对他进行一个便利。啊,便利,那传进来的值它是什么样的?刚才已经说了艾特硅谷啊。一一对吧,哎,这是第一次循环得出这个值,那第二次循环的时候,它比如说我找一个长一点的哈,比如说这个送送,他如果进来的是送送,它传进来的值呢,就是这样。好,那知道这个道理之后。那下面往上往下处理一下啊,那我们要做的是将这个Y流丝进行一个累加,对吧,那累加的话我们就需要一个变量,那我们定一个变量int sum等于零。OK,那像这个变量里面进行一个累加。加等于,等于谁呢?Y6。这样就行了。那Y6你发现Y6是什么类型,它是int right类型上呢?上是int类型,那怎么办?点儿。Get。
07:00
对吧,按点过去到它好。那获取到它之后,那下一步就是写出。哎,你上一步呢,可以认为是这个。累加。啊啊,进来一下,那写出的时候呢,就是contest.right哎说了contest呢,它是一个上下文对象,连接着这个map reducer,以及跟系统的一些呃交信息交互传递。好,那看一下它里面参数,CTRL加T。Test,那首先呢是K,那K是谁呀?你传进来的是不是就是单词啊,单词是K,那它输出呢,仍然是这个单词为K,那我这个K用不用定义不用。直接给过来就是他就是你传进来的key。那至于这个VALUE6 value6是不是应该是累加之后的和呀,你把sum一传进去,Sum是int类型,我需要的是一个able,那怎么办?变换一下呗。嗯,你有一个int。
08:00
有同学说我还放个一放一行吗?哎,我现在是不是得把这个萨放进去啊,哎,那这块要变一下这样式的。嗯,叫out。Value。然后呢,Out value.set把这个sum塞进去。然后out v把它放进去,那这个值啊,就得放到上面。Private。是吧,哎,变成这个属性啊,同样道理,因为reduce呢,是每一个P都会循环变列一次,那么这个时候呢,我们就给它放在外面,诶只创建一次对象,提高它相应的一个效率。嗯,OK,这就是整个reduce的一个编写,还是比较轻松的啊。
我来说两句