00:00
好,接下来呢,我们要编写这个map,编写map之前啊,我们先把这几张图给定出来啊,一个呢是它的输入数据。另一块呢,是对应的它的输出数据,比如说写代码啊,记住始终关注它的输入是什么,它的输出是什么样子,那这样后续在写的时候呢,就会非常轻松啊啊,那我们下面来看一下,首先呢,我们是第一个类叫word count map对吧,那我们需要继承map。Map,那继承map的时候,你会发现这里面呢,它有两个包。看一下两包,一个呢叫org阿帕奇do和MAP6,另一个呢叫org哈帕啊,Hi map什么区别?哎,这个map right啊,对应的是hidoop1.x系列的包,那hi,嗯,这个MAP6呢,是对应的2.x和3.x的包。那考考大家map在一点一点X的时候,他负责什么事?他既负责资源的调度,又负责计算。
01:02
对吧,那到了2.x和3.x系列,它只变成了负责计算。那后期我们在导包的时候啊,诶就导这个MA6就OK了。行,早下班啊。打完包之后,那这里面有对应的这个泛型打开。打开之后把这个key in value in key out value out复制出来。大家解释一下。第一个输入参数,那它是map阶段。阶段。输入的key。这个双击shift,它就出这个呃,Key的类型。那我们这个K的类型是什么?哎,输入书记来了。对吧,AK的输入类型,它是它的偏移量啊,对吧,啊偏移量。那PA这样的类型呢,是long类型。
02:07
W。啊贴比long rightable,那好,那接下来呢,Value value类型是这一行内容,那这一行内容呢,往往我们用这个test啊进行一个描述。那map阶段。输入Y流类型。那我们用呢,TXT。哎,其实就是我们的实缀类型啊相似,那接下来呢,是它的一个输出,那输出啊,这个是最终的输出,它最终的输出其实跟我们map的输出的类型是一样的啊,我们都关注的是单词对吧?诶,每一个单词出现的次数,那第一个单词呢,那很显然它是一个T类型,那后面一个value呢,很显然是一个啊int类型。那我们关注一下。说呀,Map阶段。输出的key类型。
03:01
那K类型呢,就是对应的这个单词类型啊,Test。是吧,就是一个一个单词嘛,啊,以单词为K,那对应的这个Y流值是这个单词的次数,那我们就是。Int类型map阶段。输出的value。类型,那我们用int表示啊,当然用int呀,用long right其实都行啊,后面我们。呃,会有案例,有的用的是int,有的用的是long red宝都可以。那这是相应的一个key的描述,那我们快速的把这个类型输入好,那第一个类型呢,就是longable。OK,那第二个呢是test对吧,TEST1定要注意啊,TEST1定要注意,为什么要注意呢?因为它这里面的包啊,实在是太多了。你再看一下。对吧,这么多班好多这个同学啊,一倒这个班就错了。哎,上来就是哪一个这个提示的在最上面,那直接倒了啊,当然我这里面这个是最上面哈,啊,一定要注意导的是org阿尔法提hi do IO这个包。
04:07
啊,有同学说,海哥,我这写的都很正确呀,怎么就不对呢?啊,我跟你的一模一样啊,哎,你看一下你的导包是否一致,包不行也不行好。啊,Test,那接下来下一个啊,仍然是test啊再来。Table。好,In red包也是啊,别倒书包了,找他好,那行,现在呢,就是这个,呃,泛型也搞定了,那接下来呢,我们就来看一下这个map里面到底有什么进去。诶进来看一下,呃,Map里面呢,首先一进来,呃,这里面有一个嗯抽象类对吧,Contextt上下文,上下文用来干什么的呢?我们这面是map,后面是不是reduce啊reduce,那这个map和reduce啊,未来要进行一个通讯,同时是不是还有系统一个整体的一个代码啊,也说中央的一个政府对不对,哎,那他们之间要进行跟他进行一个相互通讯,比如说网络上的一个交互啊,或者一些全局的一些啊配置信息等等,都会通过这个contexttest进行相应的一个连接,哎,相当于是一个联络员,这里面存储了大量的这种公用的一些信息。
05:15
行,那下边呢,我下边还有一个setup map cleanup,诶我们先看最后一个。啊,最后一个,最后一个呢,叫方法。那这个方法一进来之后啊,首先执行的是setup。然后中间这块进行一个循环遍历,最后执行的是clear up。那想想法执行几次?是不是程序一进来执行一次啊,那很显然它是一个什么样的方法,是初始化方法呀,好,那我们看一下它是不是初始化。说,Called once at the beginning of the task。你就说被调用一次,在任务开始的时候只调用一次,那通常情况下用于干什么初始化,那如果你不进行初始化呢,就是那行,哎,前期阶段我们一般不用这个,等我们后面这个,呃,学的这个能力啊,啊差不多的时候对吧?啊具备这种实力的时候,我们可以去重写这个赛达方法进行一个初始化。
06:10
那再往下来,下面我们先掐头虚尾啊,这是set up,那最后finally finally里面的代码是不是最后执行,那在这里面执行这个clean up,那我们看一下这个clean up。仍然是one at the end of the task,比如说在这个任务结束之后是吧,哎,只被调用一次,那在里面通常是为了关闭一些资源,哎,进行一个收尾操作哈,在这里面,那当然了,还剩一个这个非常重要的中间这个位置。爱循环便利,哎,执每一次执行这个map啊执行map,那它又是什么含义呢?看一下。在这儿。那这段代码说,One for each k value pair。In the input please。比如说啊,这个每次每一对这个K都会被调用一次,然后说most applications,速度be overri,这啥意思啊,大部分这个应用程序都会去重写这个方法。
07:10
那往往是根据你用户的业务逻辑去重写这里面你要实现的一个功能。啊,不好理解,那这个呢,是它的一个输入数据对吧,输入数据说每一对KV都会调用一次方法,那也就是说它每一一行数据,每一行数据都会进入到这个map里面执行一次啊,一行一行去处理。那这个思想要有啊,它是一行一行处理,那我现在这里面是七行,那我这个方法要调要被调用几次,要被调用七次,因为下面这有一个。For循环嘛,对吧,啊while一次一次便利一次便利。好,因为它便利的是你的啊呃,contest.np6啊相关的一个处理。行,那这个呢,了解之后,那下面我们来自己来写一下,他说呀,你用户呢,得去重写它对应的map方法,对吧,那我们就写一个,哎,你打一个map啊。
08:04
自动就出来了哈,那它这个方法呢,负类呢,肯定要删掉,那我们自己来写,那首先来看一下map的一个,呃,输入参数long right key,它对应的谁呢。电场。太白了。对应的它,哎这里面传进来的是map的输入的key和输入的value,然后对应的上下文进行map和reduce之间的一个联络,跟这个系统之间的一个联络,哎,都是由他来进行充当这个,呃,这个联络员这个角色啊。啊,那在这里面我们要写什么事呢?那你看这个输入呗,首先它进来的是一行一行内容偏移量是KY6呢是这一行。那我们需要统计单词,那需要把它切对吧?哎,先获取这一行吧,第一步。叫。获取一行。那获取一行value.to string,为什么要to string呢?你看一下正常情况下呢,我这个value啊,它是一个text类型,那text类型你看这里面有有我们想要的这个字符串新闻操作吗。
09:09
没有啊,没有的话,那我们只能把它转换成俊俊下面它有更丰富的一个字符串处理,那这个呢,就是一行信息拿到,拿到之后。下面我们要对这一行数据进行一个切割,那切割至于是用空格还是用斜杠T,还是用其他字符,那就看你原始数据它的中间分隔符是什么啊?嗯,切割。Line点斯普利特对吧?嗯,然后用空格一切,哎,中间你看这不是正则表达式吗?呃,点忘。拿到的就是word对吧,每一行单词。哎,每一行单词里面都放到这个词菌数组里面了,那这里面现在它变成什么样了?这里面它就变成了艾特硅谷。
10:10
对吧?哎,你进来的一行我一定给你写齐吧,你进来的一行长这样艾特硅谷。At硅谷,然后呢,原来进来的是test类型,经过这一行变换之后变成了G,那对这个string呢,我又进行了一个空格切割,切割出来就是它,它就会放到这一个数组里面去了,那放到这个数组里面去之后,下一步叫循环写出。循环写出怎么循环写出我就便利你这里面的word思对吧,哎,Word思第2FOR。哎,往出写,由谁往出写呢?由这个contest上下文就是它。他往出写,他这里面有一个方法叫。第二,Right。那right对应的K对吧,和value分别是什么呢?就是map阶段输出的。
11:05
Key对应的value你看。哎,这个类型,这个类型好,那这里面我们。Right,那K呢,是对应的这个单词对吧?哎,对应的这个单词,那单词是谁呀?单词是不是就是它呀。不就是AT5吗?对吧,哎,它那它我直接想把这放在这行不行呢,那你看一下这个word单词的类型是string。那我要求的是什么?CTRL加P。是不是一个test的类型啊,那不行,那得转换一下,那就拗一个test的类型,哎,别导书包了啊,然后点忘。拿到这个叫out。对吧?哎,输出的key,那key.set y往里面塞,将这个单词塞进去。再进去之后,把它放在这个位置。那这个类型就对应上了。好吧,啊,那这样对应上之后,大家思考一个问题,我这个循环它会被执行多少次。
12:05
我这一行内容如果有100个单词。我这里面是不是要循环变了100次。那如果变了100次。我是要创建100个对象。啊,大家感觉到了是吧,严重浪费你的内存呢,那是那行,那就简单海哥,那我们把它拿到上面。这样不就变了一次了吗?那再思考问题。这个map它被调用多少次?Map呢是一行内容调用一次,我这是七行,我调用七次,那我要是7万行,70万行呢。我是不是要被调用70万次?那这个对象是不是仍然很大?那怎么办?哎,继续往上提。提到这儿。提到这啊,这是一个类,那这就相当于是一个属性了,那你前面加上一个修饰符。哎,Private对吧,哎是有的,OK,那终于到了这,哎就OK了哈,这个性能呢,达到了一个最佳。
13:02
那下面呢,还有这个对应的这个呃,Y流对吧?啊,那Y流的话呢,我们是什么类型,是readable类型在上面也是在上面定义吧,Private readable。V等于new一个able。那这个值怎么设置呢?哎,直接给一就行。因为在map阶段啊,我们不进行一个聚合,只是将每一个单词都切割出来。at硅谷。然后后面一。对吧,固定格式都放一。不进行聚合操作好。那我们把这个变成out。喂。哎,格式化一下。把这个空格删掉啊,我这里面这个代码强迫症啊,空行记空格,呃,空行记注释啊,像这样的话都不允许啊,多了一行这个空格,哎,正常情况就应该是一行,哎,这是比较标准的一个写法啊,大家呢,最终呢这个叫写出。
14:01
嗯,写出这呢叫。封装。奥特。对吧,哎,这就是整个一个map的一个编写啊,非常轻松啊。
我来说两句