00:00
接下来我们要做的呢,是创建我们的项来实现这个分析的功能,所以在这么里面打开new,创建一个module。选择下一步,然后写个叫CT啊呃,咱们这个呢,就写上咱们叫做分析,诶我就这么写了啊,然后把这个拷贝,拷贝以后把这个地方给它加上。哎。嗯,好了,然后呢点击完成,那接下来呢,我们要准备去分析了,那你分析的时候要实现我们的相关的功能,而且跟h base才有关系,所以呢,我们把之前的那个什么common呢给它关联过来,所以啊这里来我们写上咱们叫他,嗯,然后呢,我们这里呢,是那个CT,我们的common,嗯,好了,写完之后,然后呢在这里给它刷一下啊刷一下保证我们这个分析的这个项目呢能够出来,而且不是标灰,你标灰的话可能是不能用的,那现在能用了,那能用的情况下,我在里面可以添加我想要的一些东西了,所以呢,来在这里面来打开,打开以后点击new创建我的package,我们叫com点爱的硅谷,然后呢,CT啊,我们写上咱们就叫分析呀,嗯,好,然后呢,那这里就先这么写吧,那你的目的很简单,就是为了分析数据,所以我点击new,我们创建一个类,这个类的名字就是我们的分析数据,咱们叫date,诶,Date是吧,然后。
01:24
那点击OK,然后呢,在这里面我就写上叫分析数据,OK,那你分析数据的话,那我这边得写一样一个我们的诶论方法了啊好,那你分析数据的情况下,那我现在呢,就准备直接去写程序了,写的其实就是map,那这个我们之前写过类似的,所以呢,我这里还是那么写,咱们叫to runner,点我们的run,哎,咱们的run啊,然后呢,这个run以后我这里需要什么东西啊。需要那个to对象吧,那所以我这里呢,就得把这个呢拿过来,点击new创建一个包,这个包的名字叫to。
02:05
啊,然后呢,在这里来,我写上咱们叫分析数据的一个to啊,然后呢,我这边创建个类,咱们叫分析数据,嗯,好,但是呀,我先给他加点东西,我加一个叫text to,我后面来解释这个事儿啊,我现在呢就先这么写,我先起这么个名字,然后拷贝点击OK,点完以后呢,我先给它扭一下放到这里,然后呢,放过来啊,然后写上我们的X好了啊行,写完之后把这个呢给他拿过来,嗯。好,导入,导入以后肯定会报错,为什么会报错呢?因为它需要的是什么东西啊,是它,所以我们的这个接口呢,我是需要去什么实现的,所以到了我们这个图里面,我们打开,打开之后来吧,我们写上叫做它,诶实现这个接口,实现这个接口之后呢,我们重写它的方法,实现它的功能,点击OK,那好在这里呢,我们就写着啊来呃,我们就要分析啊数据的那个工具类啊,咱们的工具类就是这个to,嗯,就是啊,那行了,那这个里面就有个run方法,这个run方法呢,我们可以来去执行一下,那这个时候啊,我们先搞明白一件事情什么呢?因为我们之前啊只是去用,还没有去描述它的过程,我们这里面有个叫做X这什么东西啊。
03:24
参数哪来的,嗯,自己输的是吗?嗯,那这个呢。返回结果对不对啊,返回结果啊,所以呢,同学们看啊,我现在呢,把这个地方有一个叫什么呢?咱们叫throw啊,咱们叫throws我们的exception,嗯,好了,现在我把这个代码咱们可以看一看,我这个不叫to吗?我们这传了个to吗?我点击这个叫wrong方法,点点完wrong方法之后,你会发现他把那个to和那个X呢给它传了进来,这个X呢,其实就是我们的命令行参数对吧,就是它他把这个传进来了吗?你传进去以后,它里面就会干嘛呢?叫这个方法吧,这个方法当中首先会有个什么东西叫get con对不对,一个配置啊,这个先不管它,然后点击这个wrong点点完以后,你会发现它就走到了这个里面,对不对,然后呢,里面有个什么东西啊configuration嘛,它会有一个创建,创建完成以后呢,再给它放回去,有个get,如果你为那OK,它会自己创建个什么configuration,自己创建,创建完了以后,这个给它放去。
04:33
所以咱们程序当中,同学们看是不是有这两个方法,一个叫get,一个叫吧,我们没用上,但他底层代码是不是用上了,哎,就这个意思啊,然后你再往这看。什么东西啊?它的这个地方你会发现大家看啊,它这个地方是不是有有个叫做什么数X呀,对不对,那么这个地方呢,它会怎么办呢?它是这样的啊,它把你那个命令行参数怎么办。把你的命令行参数给它传到了这个对象当中吧,啊,通用的配置的一个解析器,那么把你的命令行参数传进去,传进去以后给你什么呢?解析它的参数,也就说白了,把你的命令行参数呢,跟它自身的参数呢,做一个融合,融合之后把那个参数干嘛了?传给了什么方法,Wrong方法,这个run方法是谁的,是那个兔的run方法,也就意味着其实真正掉的是不是这个兔的run方法呀,那这个其实就是我们命令行参数做了一个融合之后的那个参数吧,哎,就这么个意思,它就这么来的,那同样道理,你的返回结果的作用是什么?你的返回结果在它的源码当中是不是就直接返回了,它直接返回以后是不是给这个wrong了,你给了个wrong之后,其实是不是就是这个方位的返回值啊。
05:50
是不是它,诶所以啊,就是说我们这个方法的那个run方法的返回值呢,其实就是这个方的返回值,那它的这个结果就在这儿了啊,我们就叫result啊,就在这儿了,所以到底是成功还是失败,我们可以在这个地方来判断一下啊,成功还是失败,我在后面做其他的逻辑就可以了啊,我们为什么把字段代码给大家去什么看一看呢?因为我们后面还会再看一遍。
06:13
啊,后面呢,我们看源码的时候还会再看它,也就意味着我们后面还会碰见这个东西啊,咱们后面说的时候,咱们再来看啊稍我先给大家呢看个加深一个印象啊好了,那这个地方呢,现在我们已经有了,有了之后呢,那现在呢,我们这边就开始写我们的逻辑了,写我们的逻辑时候啊,这个咱们就写了很多次了啊,所以呢,我们写上job啊,Job等于我们的job点我们叫get啊,Instance,然后呢,我们job点我们的什么site by啊,然后呢,接下来我们的job点我们什么东西啊,叫wait for吧,诶给个啊好了,然后呢,我们这里呢,写上一个我们的flag啊,它的一个结果,这个结果呢,我们可以判断一下,叫做if啊判断。
07:01
然后呢,这个flag如果等于true怎么办?如果等于false怎么办啊,就是这样的,那这里呢,我们就直接写了啊来return return以后其实我们可以直接写数字对不对啊,可以啊,但是我们这里呢,还是最好利用那个枚举,因为它自带了嘛,它自带的情况下我们直接写是不就可以了啊,或者我们直接点也可以,它这里面会有相应的什么操作,也就意味着有个叫做job的status是有一个状态,状态叫成功,那这个成功就有对应的数字,所以啊,我们这么拿过来是可以的啊或者呢,如果你要确实是什么呢,觉得哎老师太麻烦了是吧,你要确实麻烦的话,那是不是就直接把它那个数字二写上就行了,二和三嘛,就把二和三给它返回就行了啊,反正呢,因为这是我们的程序当中固定的写法,那所以呢,我们就用就完了啊,所以把这个呢,点我们的失败啊,只要你不成功,在我看来就失败了,那所以呢,我们就一个成功一个失败就完事了啊好了,那这个写完以后,那这个呢,应该是把当前那个to啊,他的那个class给它放进去。
08:01
啊,好,行了,那中间应该写什么东西啊,中间是不是应该写我们的map,还有我们的R啊,哎,Reducer啊,好,还有一个就是我们的output for。咱们刚才呢,给大家分析过了,在我们的整个过程当中,我们这里呢,应该有我们的map,应该有我们的reducer,咱们还要加一个我们的output form啊,有这个东西,所以我们现在要把这三个呢给他准备好,那首先我们想想吧,我们的迈在我们当前的场合下,它是从哪得数据,他是从我们的那个哈杜当中取吗?不是吧,如果是哈当中的话,是不是直接写个就可以了啊,有个file对不对,传个路径就能取出来,但我们这不是,我们这是什么呀?我们是s base啊,那么正好呢,S base它提供了一个什么呀?是不是工具类啊,哎,工具类,那所以我们的map reduce的YouTube,哎,有这个工具类,那非常的方便,所以点我们叫in,我们的table的map drop,哎,把这个呢,给它写上就行了啊好,那么这里呢,我们就来看一看,首先它有参数会出现,那我写上第一个,第一个是什么。
09:16
啊,是不是你要读取哪张表啊,那这个表咱们是有操作的呀,所以叫names,点我们有个叫做table叫log啊,然后点我们的get value诶就有了,那第二个呢,还记得吗?第二个是不是我的那个扫描啊,诶扫描,那这个扫描呢,我就可以在上面写上了,咱们叫SC啊来,那我现在呢,就要扫描我的数据,诶就是这样,那好,那我要扫描我的数据的话,其实大家想想我有必要全给他扫描吗?我是全扫描吗?我们是不是要做统计分析,你统计分析的结果是不是应该把每条数据都找到啊,但是有问题,什么问题呢?我们数据是有重复的。
10:05
我们拿什么,什么叫重复呢?你增加一个通话记录,其实我们这边是有两条数据的,对吗?哎,两条数据,我为什么增加两条数据,我之所以增加两条数据的目的是为了说我用被叫用户去查询的时候可以找到,对吗?因为他有u key的概念在里面,对不对?也就是我的目的是为了被交用户来查询数据是吧,还方便的,但是对于我统计来讲,你这两条是不是重复的,为什么呢?你这边打了我们100秒的话,难道下面不是100吗?下面是100对不对?那你把他们两个结果统计出来是没有意义的吧?哎,没有意义,所以说就等同于什么呢?哎,多了数据了,那我怎么能想办法不要这个呢?因为两个是一样的呀,除了他的那个什么主教被教的区别以外,那么我们这个是多余的呀,而且主教和被教,大家想想我们这一行里面是不是又有主教又有被教,只不过放的位置不一样对吗?一个是把主教放前,一个是把被叫放前,对不对?那正好呢,我们说了你这个主教放前。
11:05
难,那你的被角在后面啊,我也能得到啊,所以不是说我必须把这条数据拿到才能得到,我只要能够一条数据我就能得到,所以啊,我就要想办法把我们生成的两条数据,我要去掉一半,我该怎么做,我要去掉一半我该怎么做,就这条我不要,那老师那简单,你不都是零吗?你要是零的话,把那个零给它去掉不就完了,对不对?还有一个更加简单的方法,什么方法呢?增加列除的条件什么意思啊,是不是我在扫描的时候,我只扫描这一个列足啊,这个列足我不扫描那就完事了,因为我们那个被叫,我们恰恰是把数据放到了这个列组里面,对不对?我在做查询的时候我不要,我不要它的话,这个数据就根本出不来,就只剩下它了,那这样的话,无形当中就去掉了一半数据,对吗?啊,就这个意思啊,所以那我现在的这个查询你就要知道了,我要加。
12:05
加东西了,这个加东西呢,点我们叫site,我们在这个地方,同学们看什么东西啊,咱们这里面给它来啊,呃,我看看啊,咱们这里呢,给它来一个啊,我看看啊,咱们这里不是这个这个东西啊,点我们叫这个扫描的时候,我要扫描哪一个,我们的什么列足啊,那这个列足呢,我们给它来,它是一个BY数组,那我就是bit了,点我们的To Bit,这个我们叫names,点咱们有一个叫做coll是吧,咱们有两个,一个叫collly,一个叫color,我们用coll啊,点我们的get value,那这样的话呢,我们就能把一半的数据给它去掉,查询的效率就会提高啊好了,那么我的这个scan就有了,那么有了这个之后,那接下来呢。接下来是不是要传别的参数了啊,别的参数当中包括了map和那个什么output这些东西,对不对,那我们现在啊,就要准备一个map了,你要准备map的情况下,我这就把它事先准备好,来我们叫做我们的package,我们就叫map OK,然后呢,我们再来,我们点击啊点击new,我们再来创建吧,既然创建包咱们都创建好,咱们叫reducer,嗯,好了,那reducer以后咱们还有那个叫output Mar呢,所以来我们new,我们创建一个它叫IO啊,咱们叫AO叫IO以后我先把类创建好,咱们再说别的啊,然后呢,我们这个map,我们现在点一下,我写上,咱们就叫做分析,咱们就叫做分析的一个我们的map,但是我同样在上面加上一个叫text的map,哎,咱们这么写啊,好,把这个呢给它来点击,OK,点完以后你随便写个类就能叫map的吗?不行吧,是不是应该去继承啊,继承我们的s base,它提供了一个叫做什么呢table的。
13:54
诶,就是它了,好,然后呢,我一会儿再去写别的啊,咱们写上叫做分析数据的那个map,嗯,好,那我接下来呢,就把它呢放到下面来,嗯。
14:06
咱们点我们的,诶class,诶好了啊行,把这个呢,我们写完之后,那我接下来咱们就来考虑考虑了,考虑什么呢?考虑我们现在他的那个类型,我们这里是不是要加泛型呢?你家泛型的话,我这两个泛型是传给谁的,他是要把他的结果传给这边的吧,对不对,那你大家想想传什么东西过去。传什么过过去啊,你要记住啊,我这边是要聚合的,你聚合的目的是为了得到统计结果吧,那也就意味着最起码这个审核这个号你是要传过来的吧,那这个Du和号其实就是一个数字吧,是不是数字对吧,你数字做统计嘛啊,你这个通话1000秒,那个通话2000秒,合在一块不就3000秒吗?那所以说你是不是应该把这个他给他么送过来啊啊所以我这里呢,别的不说,我应该加个什么东西啊,加上一个对不对,我这么写可以,但是我这为什么加了一个text呢?我就希望怎么简单怎么来,我就写个什么东西啊,Text文本能不能传也能吧,反正你最终是传我们的字节数组,对吗?所以啊,我们写个text可以的啊,好了,那这个咱们知道了,最起码我需要传的那个值咱们明白了啊好,那我前面那个K,我应该怎么传呢。
15:25
我们这里应该怎么传啊,是不是应该是哪一个用户在什么时间点,他打的那个通话时长啊,所以我们应该是哪一个用户,哪一个电话号码,在哪个时间啊,打了多少时间电话应该是这个样子的,所以我这里也写个什么text,也是个文本啊,把这个都给它加上啊,好了,这个可能你们暂时还不明白,我们写完以后你可能就会知道了啊,所以把这个呢给它加上,加上了之后那行了,那这就简单了,那我这就写个逗号,我这就写个什么东西啊text是吧,然后呢,点我们的class诶。
16:02
咱们的class啊好,然后呢,我的text点诶class行了啊,现在呢,把这个呢给它来导进来,嗯,好了啊,然后呢,我们这里面再写上一个我们的逗号,再来加一个我们的job,诶就行了啊好了,行,我的map就算是准备好了,接下来呢,是我们的reducer,我们的reducer你要回过头来看这个里面我们的的结果是给吗?不是,那不是的情况下,你是不能用他的那个所带的那个table的吧,那你不能用它的话,是不是也就意味着你连那个我们的工具类也不能用了,那所以我们这里还就不能用它了,那不能用它的话,那咱们就得自己来了,所以点击new,点击new以后,我这里呢也创建个它,咱们还是我的什么分析什么的,来,我写上我还叫text,我叫R,我的目的很简单,就是怎么简单怎么来,咱们全用字符串啊,全用字符串我就全都用text了啊,所以点击OK,然后呢。
17:02
那不是随便写个类就能叫reducer的,我们也应该是什么去继承吧,继承有一个叫做什么东西啊,叫做reducer吧,那reducer啊,所以把这个呢给他拿过来,拿过来以后呢,这边我就写上,首先两个,这个是不是我们的什么东西啊,这个应该是我们的map传过来的吧,然后你还要输出对不对,那你输出给谁呀?你输出是不是要给这个叫奥,因为我在中间我加了一层,你中间加了一层的话,就意味着你的这个数据不是说直接就到买里面去了,应该是我们当前的output form给他,一给他的话,我说了怎么简单怎么来,所以就是我们的text来,我就这么写就行了啊,所以在这里写上啊,咱们叫分析数据啊,分析咱们叫分析数据的那个叫做reducer,诶,就是这个东西啊好了,那我现在写完之后,那就简单。
18:02
吧,那我的程序当中我就可以一点点加上它了啊,所以在这里我们写上咱们的job,嗯,然后呢,点啊点set,我们的这个叫做嗯,Reducer的class吧,然后呢,诶,我们把刚才的这个类呢,给它拿过来拷贝,拷贝以后放到我们这里来啊然后呢,我们叫做什么呢?叫class,诶好了啊,行,把这个呢,我们放到这里,放到这里之后,然后呢,我们的这个job呢,点我们的site叫output,我们的key class,还有一个job.site我们的reducer的那个class,那这个咱们说了,为了简单起见,这个怎么简单怎么来呀,所以我们就直接写上它了,然后这个呢,咱们也是这么写就可以了啊好了好,写错了啊,这应该是那个out ofut那个啊,咱们写这个东西了,嗯,然后呢,应该是那个叫value啊。好,写完以后,那这里是不是还有一个东西叫output form呀,所以我们的job应该再来一个点site,咱们的output,咱们叫form class吧,哎,这个输出你是怎么去输出的,那这个的话我就得加一个IO啦,在这里面new我们创建一个类,我们写上,诶你随便写个类就能叫做output了吗?也不是吧,所以我们点它一下点,点完以后它这里面就有约束了,你的那个类必须要去继承这个叫output form吧,我点一下它这个抽象类,那我就应该去继承它来重写它的抽象方法,对吗?所以在这里呢,我们new,我们创建一个它咱们叫my circle,然后呢,我加一个叫text的,然后呢写上叫output form,把这个呢点击OK,点完之后,然后呢来我们写上叫继承。
19:58
我们叫啊,那么这个里面也会有范型,这个型恰恰就是我们传过来的吧,你传过来的那两个东西,诶就是它了,所以把这个给它加上,加上以后它会报错,那报错的话给它来重写它的方法,把这几个方法给它放到这儿,我们这个后面呢,再去完善它,这个呢,我们写上咱们叫my circle的数据啊,格式化啊,格式化的输出对象,哎,就干这个事情用了啊好了,那这个写完以后,那我回到咱们之前的程序当中来点一下,那我这个地方是不是就直接什么写个点我们叫class就可以了啊,诶直接把这个写上啊好了,行,那我现在呢,就把整个的我们的map就是的这个架子搭好了,细节咱们还没做,咱们一会儿呢再做啊,大家先休息一下。
我来说两句