00:00
那下面呢,是要把我们之前的东西啊,作为什么操作改善一下,这个改善改哪呢?把这改一下。Text,你会发现现在我们为了简单,是不是所有的那个key和value都是那个text呀,对不对,但是有的时候会感觉比较low一些是吧?啊为什么呢,太简单了啊,所以呢,把它啊稍微的给它封封装一下啊封装一下嗯,那既然要封装一下的话,那所以呢,我想要封装,那我就把这个key和value啊给它封装改一下,那所以呢,我这里呢,来点击new创建一个package,这个package呢,我叫K啊就是我的key和那个value啊点击OK,那么点击完成以后呢,这里new我们创建一个类,这个类呢,我们就写上啊咱们的分析的一个key啊这么写,然后呢,点击OK啊然后呢,我们再来,我们在这边再来加一个new,然后呢,我们创建一个啊,咱们就要分析的这么一个value,诶好了,有key有value啊好,那也就意味着呀,我想通过我的key和value来代替那个text的啊,代替它啊,我们就不要用它,感觉太简单了啊,所以想做一个什么封装,用对象的方式来封装,但是这个。
01:08
我们奥form的放的这两个东西来自于哪里的,来自于我们的的吧,那么里面大家看我们的当中是不是也会有这些东西啊,那么这两个跟我的奥是一样的,那这两个呢,他应该跟我的那个map是一样的吧,所以买当中这边诶也要有,所以也就意味着呀,我们这里呢,可能不是说简单的替换某一个的问题,他得把一套全给它替换了啊,所以在这种情况下呢,我们要考虑到我们这个K和value能不能满足他的需求啊,不是说只替换一个叫全整套全替换,那我就要判断一下了,你随便写个K,随便写个value就能满足要求了吗?肯定不是吧,所以我们这里呢,要看一看它这里面reducer啊,这里面能放的这些内容都是什么样子的,首先我点一下,我点。点完以后你会发现什么同什么东西啊,叫吧,什么意思啊,首先这个是不是可以比较的意思啊,这个可以写的意思对不对啊,他最起码那要传呢,它可以写,可以序列化呀,哎,所以应该是这样的,那这个接口点一下你会发现怎么了,其实它是继承了这两个吧,所以也就意味着叫组合接口啊,把这两个合在一块儿了,用起来方便,那其实你分别来做他们两个事情也是完全一样的,没有什么太大区别啊,但是我这里呢,所以拷贝,拷贝以后我准备呢,要去什么呢?给它来封装一下,为什么呢?它有这样的接口,我也得去实现这样的接口,那好,那我就问同学们,这个K和Y6是两个都要实现这个接口,还是说只要一个实间就可以了。
02:44
就这个接口是两个都要去什么呢?给它来实现的,还是只要一个实验就行了,那你就要考虑到这个接口的目的是什么,对不对?首先这个我们表示什么意思呢?它最起码可以序列化吧,对不对?它可以序列化,那也就这么个意思,那这个compable呢,它表示的是可比较对吗?那这个K和value我什么地方是需要比较的,是不?那个K啊,Value不需要比较对吗?你这个是要做分组的对吗?还有排序的,那所以它是需要比较的,所以拷贝拷贝以后我的这个key啊,咱们应该给他来,咱们给他来实现啊,应该是这个样子,嗯。
03:24
好了,然后呢,在这里呢,给它来啊,把这个呢点击OK啊就可以了,然后呢,这个呢,我写上啊,咱们叫自定义啊,自定义我们分析啊数据,咱们叫分析数据的那个key啊就是这样好,然后呢,我再把这个拷贝,拷贝以后呢,再放到这个value里面去啊放过来,嗯,然后呢,自定义分析数据的那个value好了啊,那这个value我们说了,它不需要排序对不对,它不需要排序的话,那是不是只需要一个什么呀,只需要一个我们那个write就可以了,诶所以把这个咱们拿过来啊,所以把它我们放到这里,咱们叫实线,嗯,好,给它放过来,放过来以后如果没有任何问题的情况下,给它来实现它的方法来我们它好了啊,现在呢,把这两个准备好了,准备好了以后,我刚才说过了,不是说一个对象需要改,是一套都需要改,但所以首先我这个to就需要改啊,为什么呢?因为里面有大量的这个。
04:24
肯定是不合适的,还有这个map和这个都要改,都改的情况下,我尽量就不要改了,咱们创建个新的啊,所以大家看我们这个text,还记得我们之前为什么在这加了个text吗?诶就为了在这我要变一下,你之前呢,是一全文本啊,我现在就不是全文本了,我这改一下咱们叫做bin啊,改成我们自己定义的那个bin啊,咱们点击OK啊,就是这样,那好了,那这个bin我们改完以后,大家想想这还能这么写吗?不行了吧,对不对,应该是我们的什么,诶,我们的analysis啊,我们的这个叫做key,诶把这个放过来,那这个是它的话,那我这应该是什么,是不是应该是那个value了,哎,应该是那个value了啊,我这么写,嗯。
05:10
好了,写完以后,那你会发现我们这是不是报错了来报错了,报错了以后,那这个时候同学们看啊,我现在的这个地方来吧,咱们给他放过来啊,呃,我想想啊咋哦,我想想还不对啊,为什么呢?不对呢,因为我们这个text的保留是没问题的,这个value啊暂时还不需要,所以这个我留着啊,这个还是我们text吧啊,这个咱们还留着,嗯,所以啊,这个咱不用变,为什么呢?它就一个,你就没有标封装,我这有多个的情况下,我封装成的对象会好点啊,所以我这个地方来,咱们的T我放到这边啊,给它放过来好了啊。把它放过来,放过来以后肯定不对,那所以呢,我们来把这里边加东西,我们这边呢,给它来,我们放过来啊,咱们写上叫public啊,咱们的public,嗯,好,然后呢,给它来一个空的构造方法,然后呢,再来一个public,再来一个啊好,那这个呢,我们就需要传两个参数了啊来,我写个string,然后呢,写上一个我们的tell,再来一个啊,我们写上那个叫date,嗯,好了,那这个叫tell,也可以叫call,也可以叫tell,就叫tell啊,那我现在的这个地方,同学们看我是不是应该把这两个准备好啊,因为你要传数据,是不是传这两个字啊,那所以呢,我写上叫我们的string,应该叫tell,再来一个我们叫做date啊好了,然后呢,把它的那个set get方法呢,给它点击OK,封装一下啊,封装完了以后,那你的构造方法当中就应该把它传过来,所以点我们的T,它等于T,嗯。
06:44
好了啊,然后呢,这个呢,点我们的date,它等于我们的date,诶我的数据现在就有了啊,最起码的我可以通过这种方式来构建我的对象,你构建对象的话,那么我的map当中我的那个B打开啊,这个呢我们打开,打开以后这里就别用横线了啊,咱们直接用逗号就可以了啊,所以我把这个呢给它替换一下,嗯,把这个呢我们替换啊来。
07:09
把这个闹看啊,咱们这个地方。直接来吧。把这个替换成一个逗号啊,咱们来替换诶好了啊,现在呢,我们替换以后,现在我们这边就可以把我们当前的对象给它封装好了,我的这个key就有了啊,只不过呢,你这个key啊,我这么写呢,还有点问题,所以我们点一下,为什么有问题呢?因为我这边重写的方法当中啊,还没有给它完善呢,第一个啊,咱们写上叫做什么呢?比较啊叫比较,第二个呢,我们写上啊,咱们叫写啊,咱们叫写写数据啊,写数据说的简单点就是序列化的意思啊,那么这个read是什么意思啊,读数据,这个读数据啥意思啊,就是反序列化版啊,一个是写,我要序列化进去,那我读过来我要反序列化啊,应该是这么个操作,所以在这种情况下,我们这边该怎么做,同学们想想,那么我right,那其实我我所谓的序列化,是不是就把我的属性给它序列化进就行了,所以呢,我的out应该怎么办?他应该有一个叫点啊,点我们的right吧。
08:16
我们用一个utf是吧?嗯,好,我按照我的顺序,我就先把这个tell啊,把这个T呢给它来序列化了,然后呢,我再来点我们的right utf,把那个date给它序列化了啊,所以我们这里呢,给它放过来,那你序列化咱们现在已经有了,那么你反序列化呢,你反序的话是不是正好相反呀,那所以我的T它应该等于我的in点瑞的咱们的utf啊,就是这样,那么你这地方写上我的date等于in.read的UTFA,咱们这么写就行了,你要记住顺序是不能写错的,你第一个往序列化是不是一个连续的一个数据啊,那也就意味着你先把tell,你马上把date的话,它是连在一块儿的,同样道理,你读的时候怎么办?也是把第一个先读成我的tell,把第二个读成我们的date吧,哎,有这样的一个操作啊,所以有一个序列化,有一个反序列化啊,好了,那这个就没什么可说的了,那接下来是我们的这个。
09:16
这叫比较,这个比较是比较两个对象吧,那你比较两个对象的话,我这里其实应该加个泛型,谁跟谁比较啊,是不是我们这边来比较对不对,它来比较的话,这个比较的对象应该就是它了啊,所以我们写上叫K啊,就这么写。你这么写完以后,就意味着我要跟我自己来比较啊,我的对象类型一样,那么我要比较才有意义,所以我这边加了一个泛刑啊,加判刑,加泛刑以后,现在我要比较那两个对象,我怎么知道它们俩相等还是不相等呢?谁大谁小,我我怎么知道。那我本身两个对象想比较的话,肯定靠自己是不行的吧,对不对,我们一般就靠它的属性吧,哎,属性谁大谁小,咱们一般是这么做,所以我们这里的比较呢,其实比较的是它的两个属性,一个叫tell,一个叫我们的date啊那我们比较两个我们都要比较,为什么呢?因为有可能我的tell相同对吗?你要相同的情况下,那肯定比较的是我们的date的谁大谁小,那如果他tell电话号码都不一样,你比较日期是没有意义的,那所以在这种情况下,我就先比较我们的什么tell,那所以呢,我就写上叫T点。
10:28
记住tell咱们这个属性是个什么类型啊,是一个使运类型,使用类型,字符串类型,能不能做比较,它本身就能做比较对不对,所以我们这个操作就简单了,叫点它有个叫做什么呢?Compare to,那它可以跟我们K,点它里面的什么get我们的tell,我把我当前对象的那个电话号码跟你传过来的电话号码能做一个什么呢?做一个我们的比对啊,来得到一个结果,这个结果呢,我们称之为叫诶叫结果,然后呢,我把这个结果呢,给它来我们的诶就可以了,可是有一种情况,什么情况呢?万一他俩相等的情况下,我就要看看这个日期相不相等了,所以我这里还得再判断一下,叫做if,我们写上啊,咱们叫如果等于零,它如果等于零,是不是说明两个相等啊,两个相等的情况下,我要看另外一个属性了,所以我们的result的结果result啊,它等。
11:28
与我们的date点,我们的date也是字符串啊,所以compare to我们的key.get date,哎,这样的话我们的结果才是对的啊,所以啊,我们通过这种方式来判断我当前的这个K谁大谁小还是是否相等,这个咱们可以判断出来啊,好了,那你这个判断出来以后,咱们这个map里面的东西应该就改善完了,最起码呢,我们封装的对象这个呢,就因为就一个我封装test知道没有什么太大问题啊好了,那这个做完以后,它的数据应该给谁了,是不是应该给我们的那个叫reducer了,所以reducer应该拷贝,我把它也变成并不是text了啊,所以把这个来。
12:11
点击它,然后呢,把这个B呢,我们在这里准备来变一变,首先记住这个就有了变化,这个应该是我们的啊来我们的this,我们的key,哎,就是它了,这个是text的吧,这个不用变,然后这个key应该怎么办?我们那个key是不是原封不动的去传呢?哎,所以咱们这个泛型的怎么放到这儿啊,那这个text呢,这个T是不是应该是我输出,这个输出不是说只有一个吧,有两个了吧,那有两个的话,我就封装成个对象啊,就一个你就不用封装了,那俩我还是给你封装一下吧,所以呢,我们的reducer,我把这一块的类型我变成它,诶好了啊,变成我们的这个,好,你把这个变成它呢,我们过来,那这个时候呢,我们的key就会发生变化,我的key呢,应该就是它了,诶,把这个key给它拿过来啊,然后呢,我的value应该就是我们的这个。
13:02
啊好了,那然后大家想想,既然你要给传过是这个类型,那你的new是不是应该是他啊,艾是他,你是他的话,里面是不是应该也有东西啊,所以我点一下,点完以后在这里我们也给他来咱们public啊,咱们这里呢public,嗯。然后把这个拿过来,我们一般情况下都会给对象准备一个无参的构造方法,然后再来一个有参的啊,所以把这个放过来,放过来以后这里面呢,有两个值,第一个啊,我们叫做string,咱们叫some,还有一个是那个我们叫做some啊duration嗯,咱们的duration OK,然后呢,这两个东西我们也要传呐,那所以呢,我们写上叫啊string,我们叫some,再来一个private,我们叫做string叫some啊我们的duration OK,好了,写完之后,那这个时候呢,我们这里可以这么写上啊来,我们叫这点它等于这个,然后这是点我们的some duration,它等于我们的duration,诶就可以了啊好了,那这个写完以后,那下面是不是是一样的呀,下面也是写数据吧,它也是一种序列化的表现,那下面这边呢,都是完全一样的,叫读数据嘛,嗯。
14:18
所以我们写上叫读啊,咱们的读数据,OK,那么写数据的情况下,那我就直接来了,我们的out点我们的right啊,Right utf,然后some,我们的duration啊,先写啊,然后呢,再把这个呢,嗯,写上我们的Du,这个顺序千万要记住啊,别写反了,写反的话可能会有问题,所以我们的call啊,它等于我们的1.read啊,把这个拿过来,还有我的Du。它等于一点我们的这边,诶好啊行,那我现在把这个写完之后啊,那么我们现在这个value应该没有什么太多问题了,那么value有的话,你回到那个reducer当中,我们这个地方应该是对的,既然是对的,把这一块呢,给它来写个逗号啊,写个逗号啊好了,然后呢,这边呢,我看看他会报错,我看看啊,诶哦,这是int类型是吧,那这简单呀,Int类型简单,嗯。
15:14
啊,所以说我们这直接来就可以了啊好了,那这么写完以后还剩下什么东西了,是不是还剩下我们的这个它了啊,这出错了对吧,那这个地方出错呢,我看看咱们这个地方,嗯,我想想啊,咱们这个地方看看啊,那这个应该是他。对吧,哎,它但是它的话,那咱们这其实是不是就是我看看啊,咱们这个duration,那这个应该是取的什么值啊,是value点咱们叫好忘了给加什么了吧,忘了加set盖的方法了,是吧?啊咱们这里来给它加一个我们的set盖的方法啊,好给它加上,加上以后呢,这里我可以点出来了啊,点我们叫get啊嗯哦不是什么东西啊,这是好不用改吧,我想想啊,咱们这个是不不用改啊,我就写错了啊,我这是不是就text啊,咱们从这传过来就是text啊,我写错了啊,这就是text啊,咱们这个后面这个需要是VALUE6需要变一下啊,那也就意味着我们前面的计算结果应该是对的吧,啊是对的情况下,那我这就不用变了啊,也就是说我们现在呢,就这么做啊好了,那你这么做完以后,你的map有了,Reducer有了,那reducer是给谁准备的,是给那个叫output form吧,哎,所以我们拷贝啊,我这就不用。
16:34
啊,咱们在那个T下面,咱们写上一个B。在这儿我写上一个B啊,好,点击OK,点击完成以后,那在我们这里,我们这儿就不对了,这个地方应该是我们自己的吧,对不对,诶,所以来我们的key,那这个呢,恰恰应该是我们传过来的那个value,嗯,这个是我们的value OK,那你这写完以后,很多的地方它都会出错啊,所以拷贝拷贝以后呢,我们往下走,这个地方就不对了啊,它应该是K,这个应该是我们的value,嗯,好啊行,写完以后呢,后面有没有输错啊,这边也不对啊,这边是key,然后呢,这边呢是我们的value啊来。
17:16
好了,那这个呢也不对,那这个呢,咱们也得跟着变啊,来在这儿把这样都得变啊,记住也就意味着我们这是一套一套东西的话,你改一个地方,别的地方都得变,证明你没办法啊,然后呢,再往下走,下面还看有没有别的出错的地方啊,下面下面这个好像就没什么太大关系了啊,主要呢,就是我们这个key和value泛型的问题啊,这个泛型呢,给它拿过来,拿过来以后这边没问题,没问题的话,那其实我们的问题是不是就在于这个key和value的读取数据上了啊,所以啊,我看看啊,咱们这里呢,咱们是key.to string啊,这个肯定就不对了,所以啊,咱们这个key,其实我们这个key好像这个tell和did都已经分解了吧。所以不需要了啊,哎,不需要了啊,这个地方我们就直接来,我们叫做K点,我们这个叫get tell吧,对不对,那这就直接来了,叫key点我们的get date啊就是这样,那同样道理,我们这个它是不是也不用不用做操作了啊,这个呢,我们也去掉啊,咱们都去掉,这样的话还简单了一点啊,咱们的value,这个value呢,我们直接来,咱们点有一个叫get,我们的空啊下面呢是我们的duration,咱们的value.get我们的some duration诶咱们就这么做啊,所以啊,泛行变里面的逻辑呢,也会有个简单的变化啊好,来看看上面这些地方啊,上面的地方有没有问题,上面好像暂时也没跟那个key和value打交道,那就是我们这样有了变化啊,好了,行,那现在呢,我们的那个format有了,我们的那个map和reducer有了,那剩下什么东西了,剩下这个to了吧,这个to我们也得改一下,嗯,拷贝拷贝完成以后,把这个to也要改成我们的宾啊。
18:55
好,我们点击OK啊,把这个呢,我们它来看一看吧,首先那这个都不用说,没什么可说的了,那么下面这也都是对的,那这块的地方应该是变一变了,这个应该改成那个叫B啊,改成那个叫B啊,同样道理,那我这个地方呢,应该改成那个叫key啊,应该改成那个叫T啊,所以把这个呢拿过来,把这个呢拿过来啊好,那这个不用变吧,因为map当中它就是就是它啊,所以这个不用变,然后这个呢,应该改成我们的宾啊,改成B,然后呢,同样道理,这个应该是那个K啊,这个应该是那个value。
19:32
好了啊,所以把这个呢拿过来,把这个呢也拿过来啊好行,接下来是我们的这个地方,这是我们的也要改成一个叫bin啊,改成它保证呢是没问题的,嗯,行了,那这个改完以后呢,咱们现在呢,这一块呢,应该是OK的了啊,接下来那我还要改一个地方,就是我们这儿了,这个地方应该就给它住掉了啊住掉以后呢,打开那这个地方应该改成我们的B,诶好了啊,就是成套的东西呢,我们都要变一下,正好呢,把每个对象之间的关联呢有一个印象,这样的话改起来也会更容易一些啊好,那我现在呢,把这这一套东西啊,我们全给它变了,那变了以后其实主要是把那个什么啊,自己封装的类给它加进去了嘛,那所以别的倒没什么太大的变化,那我接下来呢,就准备跑一下了啊来,我现在呢,把我数据库当中数据给它删掉啊,这是我上节课的执行结果,在我们课间的时候呢,我们可以看到啊,这边呢都有了啊,所以呢,我这里呢把它清空啊清空清空。
20:32
通以后,那我现在呢,就准备重新打一个包啊,把当前的这个分析的打个包,呃,打包点点,然后呢,这边直接来我们build啊。Build了以后,只要他不出现任何的问题的话,我们这边的结果呢,应该是可以了,那好,接下来我在这边去找到我的out,然后给它刷新一下啊刷新刷新之后把那个它别的都不用管,就把它拿过来,在我这边就直接给它拖过来啊,诶拖过来拖过来点击确定,点完之后,那我在这里面呢,准备重新的再来跑一下啊,因为把程序改了嘛,改完以后看看能不能正确的执行,所以呢,我们直接回车啊,回车以后啊,我们看看我们当年的效果,只要数据能出来,那就说明啊,我们这种改善是没问题了,以后再往对象里面加新的属性,我相信也没问题了啊。
21:27
嗯,这个呢,还得稍微的等一会儿啊,嗯。行吧,他等的过程当中啊,咱们回过头看咱们的那个文件吧,啊,咱们看咱们那个文件吧,给咱们核对啊,点击一下我们的电信客服啊,因为我们这个做完以后啊,咱们买circle里面有数据了,那我的分析功能呢,其实就算是完成了,所以呢,我们把这个分析呢,这块呢,我们再简单的过一下啊来。呃,这里说了啊,我们的数据已经完整的采集到了我们的base当中,然后呢,要通过我的map呢,把我的数据放到我们的MYSQL当中,只不过呢,我们要把一些业务指标给它考虑清楚,也就意味着你的一个map可能会产生多条数据,而不是说你查一条诶能生成一条,查一条生成一条,不是的,要把多个数据准备好,为了统计的方便啊,所以我们在这里呢,我们采用的是我们map通过雅安的方式,还有一个叫买circle output form,把它放到了MYS当中啊,就这么一个关联,嗯,然后下面呢,是说我们的业务指标啊,每天主教通话个数的统计,还有通话时间的统计,还有每月通话记录的统计和通话时间统计,这个咱们都做了,但是有一个咱们没做。
22:40
这个叫用户之间的亲密关系,咱们没有做,那我想同学们想想啊,我今天说到这儿了,你们想想,如果要你们来做这个功能的话,你们该怎么做,我们该怎么把咱们当年程序咱们改一改,你们想想。啊,所谓的亲密度就应该是谁给谁打了多少次电话,打了多少时间对不对,那也就意味着我照样的统计通话的次数和通话的时长吧,只不过不是某个用户在某个时间点的这个数据了吧,是什么,是谁和谁对不对,当然你说时间点也可以要说我十份谁,我跟谁打打电话多对不对,这也可以,但是主要是谁啊,是用户之间吧,那么也就意味着我们之前的这个什么里面的数据咱们可以再增加对吗?比方说来咱们举个例子啊,咱们就不演示了啊,因为这个相对来说就比较容易了,咱们这个map里面打开,打开以后咱们现在是主教和被教,那如果同学们想想,你再加上一个用户的亲密关系啊,咱们叫亲密亲密关系,那是不是就意味着我只要把那个另外一个电话号码给他记下就完事了,是不是这样的,那所以说大家看我能不能这么做呢,拷贝拷贝以后呢,我在这里写上一个什么东西呢?来咱们再写上。
23:58
举个例子啊,咱们叫靠一。
24:00
我这行不行。我再加一个,加一个的话,是不是就他们俩的关系了,那我统计数据是不是以他们杀为为准来统计数据啊,啊就这么个意思啊,所以呢,在我们当前情况下,这个咱们就不写了,因为其实就是增加一个属性的问题啊,那你这个key呢,也可以想办法换一个啊,也可以再换一个,比方说我不用这个key了,因为这个key呢,其实主要是对时间来做的啊,这个呢对亲密度来做的,所以亲密度呢,你可以再换一个K,但这个不用改,那个value不用改,因为就是一个时长和一个时间,这个不用改,这个K可以换一下啊,哎,老师呀,那我K我用一个难道不行吗?我用一个,我再加个属性行不行,行不行,还真不行,为什么呢?因为大家想想,如果你再加一个属性,举个例子啊,你再加一个属性,你再加一个属性的话,比方说我叫T2。我这个是的不现的吧,你在统计下面的时候,是不是才出现,那就说明你在上面不会出现,可是问题就来了,你在上面不会出现的话,你这个属性是不是得加,你加上了以后,但是你怎么做序列化和反序列化呢。
25:16
你这个序列化如果为空的话,那么这边读取各方面它就会有问题,还有个东西什么呢,比较。你这个比较怎么做,因为我现在如果是大家想想,如果就是只要两个参数的话,我只比较两个就行了吧,那我怎么着,你有没有第三个呢,对不对,那么第三个你有的情况,那我大家想我是不就这么判断了,你这么判断的话,是不是应该怎么写,是不是应该写那个T2,咱们举例子,T2它什么不等于那吧,你不等于,那我是不是该比较他们俩了,他们东西吧,我先拷贝吧,但是你这个比较是不对的,为什么呢?因为你这么比较会导什么情况呢?导致我们这个T2它可能会出现,可能不会出现,那么这样的话呢,我们两个对象之间的关系就变得更加复杂,那这样的话,我们后台生成的数据呢,就会什么呢,比较混乱,所以在这种情况下,我们为了让两种什么呢?让两种类型呢不冲突,所以呢,我们就不要给它混在一块儿了啊,你不混在一块儿的情况下,那么你可能要创建一个新的一个K啊,创建一个新的K来保证这一点啊,就这么回事,所以啊,这个其实加个属性问题不大。
26:23
主要考虑是一个比较的问题啊,所以我们这个呢,就不管它了啊,就告诉你有这么回事儿啊,所以啊,你先把这个搞明白了,你可以尝试着把它写一写啊,这个呢,其实写起来并不复杂,就是创建一个新的问题啊,所以啊,我们这个呢,先说到这儿啊,咱们回过头来看这边,嗯。咱们现在这边是不是已经完成了啊,完成了以后,那我来刷一下,刷以后你会发现是不是数据出来了,而且那个TID和那个data ID都没问题吧,这说明我们自己封装的这个K和Y6能不能正确执行,应该可以吧,对不对,因为跟之前的结果是完全相同的,所以呢,我们这个K和Y6怎么封装,怎么比较,怎么去做一些序列化,这个更能东西呢,不要写错了啊,好了,那这个呢,咱们说完之后,咱们回过头来接着从这边来说啊。
27:09
呃,下面呢,是我们说根据需求目标设计出我们的这个表结构,还有根据什么年和月这种东西,这个呢,其实我们表结构该怎么分析,怎么去做,这要看实际的业务场景啊,业务场景需要哪些字段,你把那些数据呢,给它统计出来啊,然后下面的这边他说了啊,我们什么时间呢,维度啊,包括一些业务的需求啊,有个输出,有个买,然后下面呢,有个叫rockie啊,这个rockie的格式这边已经告诉你了,包括我们的分区号,哈希分区号加上call一时间CALL2,包括flag,它那个顺序跟我的顺序不一样,我是把那个flag呢放最后了,它是放中间了,这个问题不大了解就行了啊。然后呢,我们的family,我们有个叫F1,有个叫F2,其实我们的列足是不是也是两个呀,列足是两个,记录同学们列足是两个的情况下,这时候你要考虑一件事情了,考虑一件什么事情呢?我之前咱们给大家查询的时候,你还记得吗?我们查询的时候是不是加了一个列足啊,对不对,那么我们说了你。
28:09
一个列族是不是查询的数据就会变少啊,没错吧,那么你查询的数据变少,是不是我们这就会变快啊,没错吧,但是你这是变快了,可是对于我们这边来讲呢,你的map来讲,同学们想想。你们这边是不多就等于多了一倍的,就多了数据了,对不对,那好,那你觉得我们这边加合适还是不加合适。就是你这边是变快,那你这边是不多数据了,是不是啊。是不是多数据了没有?没有多,为什么?因为你的主教被教是不是一定要生成呢?也就是说主教一定有三条,被教一定有三条吧,这怎么可能会多呢,对不对,那么也就意味着,如果咱们的同学们啊,如果咱们同学们这个地方啊,来咱们同学们这个地方,如果你要不加这句话,你不加这句话的情况下,大家想想会出什么问题,会全部的数据都查一遍,对不对,但是告诉你没事儿。
29:09
如果你全部的数据都查一遍的话,是不是主教和被教同时存在了,那你这怎么了?就不需要他了吧,就没有这个主教的概念对不对,为什么呢?所有的数据都有了吧,扣一就是我们的第一个用户对不对,第二个就是扣二呗,对不对,就不是要主教背景的用户,但是我告诉你没事,这为为什么没事呢?因为数据总量是一样的,你想想是不是这么回事。数据总量一不一样,数据,也就是你的map阶段生成的数据是不是跟我们没有区别啊,那也就意味着我这边怎么查询快怎么用吧,对不对,因为什么呢?因为你这边的数据总量是完全一样的啊,完全一样啊,只不过就是什么呢?你那边多,你那边是什么呢?多了一倍,那我这边就自动就乘二了嘛,那所以呢,这样的话数据总量没有变,Map阶段的数据总量是没有变啊,那么这一块呢,我们说了它的查询数据快是非常不错的,因为它来自于我们的base,快速查询我的数据,然后呢,我的这边的数据总量没有变,那么结果的数据呢,应该也不会有太多的变化,所以啊,我们这还是加上它会更好一些,那这边多就稍微的多一些啊,所以啊,我们这里呢,涉及到一个两个列足的问题啊,然后靠一靠二,那不用说了,都是我们的字段了,那么下面呢,是我的时间戳,我们的Du,我们的flag分别都代表了什么含义,咱们都讲过了啊,然后下面呢,是考虑我们买circle的那个结构,买circle的结构啊,我们再给大家讲了为什么要。
30:33
增加这么一种表叫做什么呢?叫做我们的联系人的表,也叫做什么呢?通讯录的表,我们是为了能够把我们的那个通话记录,那个表的数据呢变得越少越好,你的数据越少,你的效率就越快啊,就这么一种情况啊,然后下面呢,是我们的通话,这里面呢,包含了我们的什么呢?在计算我们的那个,只不过呢,这里面还包含那个ID啊,包含了我们的ID,这个呢咱就不管它了啊,然后呢,接着往下,下面这个地方呢,有一个我们的date,这个跟咱们前面是完全相同的啊,都是我们的那个时间啊,就这样啊,说到这儿了呢,我就把咱们这个地方要来,把我这个我这边的这两个表的结构啊,给你们来点击我的导出,然后呢,SQL文件。
31:17
啊,我就放到这里啊,放到我放到这个代码里面啊,就放到这里点击保存,点击它啊,那这样的话,结构和数据呢都有了,你们自己下来呢,直接运行就可以了啊,所以呢,点击它啊。好了,接下来呢,下面下面这个是那个什么用户的关系,说白了就是那个亲密度的一张表,这个我们说了暂时就不给大家做了啊,你能够把前面的做完以后呢,自己可以尝试着再去加这样的东西,可以尝试着去做一做啊好,接下来呢,下面是环境的准备,这个我们说了,所谓的准备呢,就是把那些依赖关系给他准备好就行了啊。下面呢是我们的包结构,这个包结构记住啊,它这里面有这样的要求,你倒没有必要非得跟他一样,就是只要能够满足我们自己的业务需求就可以了,它这里面什么K啊,什么啊ER的什么runner啊,它起的名字,只要咱们理解什么意思,咱们别缺了就可以啊。好了,下面是我们的类啊,有包还有类,那么这个类呢,就有很多什么map啊,什么reduceer啊,什么runner啊,什么form art呀,还有这些东西什么value,我们可能啊,没有它封装这么复杂,它这里面呢,封装的特别的复杂啊,所以我们呢,就简单的来用,能跑通就可以了啊,所以我们跟它有点不太一样,不过呢,你要有时间的话,可以把咱们的这个。
32:31
什么呢,里面的课件的东西啊,稍微的看一看啊呃,能看明白也是非常不错的啊嗯,然后下面呢,就是我们的代码实现了,那代码实现的话,这个就需要你们自己一步一步的去看看了,咱们就不说了啊下面呢,是我们的运行测试,把我们买驱动程序的架包呢,放在我们指定的位置,那我们可以找到它,那如果你用red的话,那个red加包呢,也要给它放过去,正好呢,那个red呢,我这边呢,也是事先给大家已经准备好了,在这个里面,我们的red加包也在这里面,你放到跟买S驱动程序加包放的位置一样,也就没有问题了啊好了,那接下来呢,下面呢就是说哦,这就已经完成了啊,提交任务,提交任务以后去执行就可以了啊,行了,我们的数据分析啊,就已经完成了啊,也就这一块的内容呢,我们就告一段落了啊,所以这。
我来说两句