00:00
好,接下来呢,我们来做一个排序相关的案例,首先看一下需求说,根据2.3序列化案例产生的结果,再次对肿瘤量进行倒序排序。啥意思?2.3那个案例还大家还记得吗?咱们之前讲过一个2.3。对吧,哎,是序列化的一个案例,我把这个结果啊,嗯,给大家跑一下啊,输出到OUT4。执行一下。好,结果来了。你说我们输出的文件长这个样子。F1截出来。输入文件长什么样?还记得吗?输入文件也给大家准备一下吧。输入文件在。这是我们2.3的一个案例,2.3的案例啊,说呢是序列化啊要求啊,我们这个B对象对吧,这里面有上行流量下行流量,还有一个总流量。哎,他们作为flow b进行网络上的一个,呃,Map与review之间一个传输,啊,手机号呢,作为key,这是Y6。
01:07
是这样吗?那现在呢,产品经理就。升级了啊,对这个需求升级了,他说什么呢?我希望啊,你这个输出的结果,我按照要求,按照总流量的倒序进行排序。比如说它的种子量最多,那我就先放在这儿,然后呢,下一个呢,嗯,这比较少吧,啊,然后放在这儿,然后呢。拍一个比如说360,那肯定最小了,往上的话,它那就是117684。再来一个啊五八。五六哎,这样一个顺序倒去黑牌。其实在生产环境下,这种需求也比较多,比如说我们一般会统计说某一个地区它销售的一个排行,比如华北地区哪几个城市销售排行的一个套文。对吧,最近这个比较火的说北方城市GDP排前十的城市有哪些。
02:01
这都是这种排序问题啊,包括像双11说这个北京,嗯,这个热门商品销售热门商品的TOP10。或者广州啊,这个热门商品的TOP10。都是一个案例啊,都是这种方式啊。那这种方式怎么能实现呢?比如说我们啊,需要按照某一个值进行排序。那要是排序hi do当中默认对哪些框架或者是这个组件进行排序啊,是默认对key进行排序。那如果你想对K进行排序,那么我这个flow b,我想按照它排,它就得放到这个K里。那如果按照我们之前的之前我们序列化的案例,就是将手机号作为key,然后呢,Flow bin作为白领。如果我想一步到位得到,按照这个总流量再倒一排序,那我原来这个案例能不能行?一下能不能搞定。
03:02
搞不定啊,正常情况下呢,就是我们处理办法很简单,先用这个输入变到。变成它之后,然后呢,我再把后面这个Y6值。作为K,然后它变成Y0。再来一个MA60,然后输出。就可以了,也就说在传输的时候把它变成flo b,那不就能排了吗?那B呢,我们可以控制它按照谁进行排序,然后Y6呢是手机号。这样一个思路哈,现在我们来看一下这个整体这个嗯,思路啊。这边有张图。像这个处理办法呢,我们通常的办法呢,是哎,在2.3的基础上先得到。对吧,手机号上行流量下行流量以及总流量,拿上一个60的输出结果作为另一个MA60的输入。然后基于他再想得到啊,按照这个手机总流量进行降息排序。
04:02
就可以了啊,你或者说你把上一步直接抛弃,我就认为这是输入可以吧。啊,这个思路比较简单,那如果它是输入的话,怎么能得到它呢。刚才说了,那我得把它们作为一个整体,放到map阶段的输出key。对吧,那手机号呢,放成Y0,然后这个K呢,我对它按照这个总流量进行排序不就可以了吗。往下走。那我这个flow b呢就得变了,原来flow bin只是进行序列化,重写它这个接口就行了,现在呢,我需要增加上对应的比较,因为key必须得支持排序。你要想不排序,那你就不能用海波框架,海波框架默认就排啊。那进行这个接口重写这个compare to方法实现。那在这里面进行一个总流量的一个比较,那在map当中,那它的输出。要注意那K呢是B,哎,K是B,然后手机号呢,反而变成了Y6进行传输,因为手机号不需要对它排序,对吧,我对排序的是它。
05:07
那再来,那接下来到了这个radio阶段,Radio阶段呢,这里面哎,循环进行一个啊便利。输出就可以了啊,正常往上写出,那这个循环便利这块啊,后面给大家解释为什么要循环一下。好,这就是整体的思路,那下面我们来写一下啊,写一下的话呢,那这个比较简单,怎么办,再拗一个。Comparable接口啊。好,那用一个它之后,我们把它拿过来。对吧,诶直接将上一个这个序列化的案例拿过来之后,但是要进行一个修改,原来呀,你只是实现这个write接口,现在呢,需要。Compare报接口对吧?啊,Right包compare报接口,然后它这里面有泛行。
06:02
那有泛型,泛型的话呢,是你的比较对象,那我跟谁比呀?哎,跟他自己比。对吧,哎,跟你第一次传进来和第二次传进来的值进行一个比较。二加回车实现里面这个compare to方法方法。那我们按照总流量的倒序进行排序。总流量的倒序。排序,那怎么写呢?If this.sum floor,如果说它大于对应的你传进来的o.some floor。那我返回一个什么呢?由于你是倒叙。我这里面返回的是负一,如果是正序的话,我们返回的是一,嗯,这个呢,嗯,你也可以对吧,你先写一个这个一,然后执行一遍,执行一遍觉得不对,然后你再反过来也行啊,当然了,我告诉你啊,现在是我负一啊,你们在学Java的时候应该讲过。
07:00
一。再来this.sum flow,如果说它小于O点3FLOW。那这块我就return。一对吧,啊,然后I补齐。把它完整性补上啊,比如说瑞零相等。那这个compare to方法就写完了。哎,就这么简单对吧,那写完它之后呢,我们接下来写一下这个map,那这个map啊,由于它输出的这个K。得把这个flow b放在这儿,然后呢,这个手机号放在这儿,他俩得互换位置对吧,那你一互换位置啊,下面这些内容呢,就都得改掉了哈。我们重新来写。罗比。Joy。手机号作为test。Map。OK搞定对吧,哎搞定,那下面我们来分析一下。我的输入数据长什么样?
08:06
这是作为我们的输入数据对吧。输入数据放这边吧。那第一步呢?老生常谈叫获取一行。哎,获取一行,那就是这个Y6.to,使劲点Y啊line获取一行。那就相当于拿到这一行呗,对吧,拿到这一行之后,那下一步进行切割。Line点斯伯利特对吧,我们这一切用什么切?应该是斜杠T吧。斜杠T看一下原始文件。原始文件,嗯,这应该是斜杠T啊好,斜杠T的话,那就y.Y。斯伯利特得到它,得到它之后下面呢要进行一个封装。哎,封装封装的话呢,就是把这个里面取出来对应的手机号,取出来上行流量下行流量以及总流量,对吧?哎,然后封装到这里面去,那你要往这里面封装,首先你要准备对应的K和YOK。
09:15
Private。Flow b啊,别走书包了啊,Compare to一下子啊,然后这里面呢,是这个out key了,等于又一个flow。嗯,OK,再来private。Test。Alv等于另一个test。搞定,那这两个输出准备好,准备好之后呢,下面我们来设置一下,那首先第一个二塔。Put。点先。啊,先把V写来就行,嗯,V的话呢,我们是谁呀?是不是这个手机号,嗯,手机号的话呢,那我们这里面设置的就是斯布利特。零是不是取出手机号了,哎,那它取出完之后output key。
10:05
K呢,点set第一个up flow,那up flow呢,就应该是这个斯布利特级啊。Up flow01是不是一呀,一但是呢,你发现这里面CTRL加P,它要求是一个浪类型,那我这个是实践类型怎么办。Long。点pass了,是不是这样就转换了,OK,那再来。Output set up。然后让。俩帕拉斯普利特。二哎,搞定它,那还有一个sum流量,那就是output。第二。Set sum,哎,Set sum,它在底层就会将up flow和down flow进行一个累加就可以了,回来。行,那这个呢,是这个out put k和out put v,我们就设置完了,那下一步呢。
11:05
写出。写出的话,contest.right right output output。对吧,哎,很轻松啊,这么几步搞定,那这几步拿下之后呢,下面呢,我们再来写一下对应的这个啊reducer哈。Reduce拿过来,那reduceer也得进行一个修改。因为他这个输入的key是不是就变了,因为输入的key啊,是先输入的是罗B之后呢,是这个手机号。把它拿走。OK,好。拿到之后,那下面呢是re。搞定。搞定之后,那这里面啊,大家看一下我这里的数据,我现在进入到每一个reduce里面,是不是都是总流量相同的内容会进来。对吧,因为我们按照的就是这个总流量嘛,进行排序的嘛。那你看我这总流量,这有一个240,这还有一个二百四总流量,这还有个肿瘤240。
12:05
那会出现什么情况?这三条二百四是不是都会进入到同一个这个里面去。那如果说我正常的CONTACT1输出,那我说只输出一行。那我要想让这三行都输出去的话怎么办?那我说得循环变列这三个值啊。对吧,哎,这三个值,然后把这一行一行一行是不就OK了。哦,是这样的含义,行,因为我要求这三个手机号都得有,那都得有的话,这里Y64里面存储的是不是就是这个手机号。那第二。For循环。对吧,那这里面就是第一个手机号,第二个手机号,第三个手机号好。那之后contest.right往出写,那往出写,那谁是K谁是Y6呢。看好了,我最终希望打印的仍然是手机号,是可flow,是value。那好,那你最终输出的,那这是不是就是取出来三个手机,三个总流量相同的这二百四二百四二百四二百四其中的一个手机号,那这一个手机号是不是先放在这。
13:10
因为最终他希望这种打印结果吗?好,那他往这一放,那下一个呢,Value,这个value是谁。Y6是不是就是内容啊。对吧,哎,是我这里后续的这个B内容,那flow bin,那不就是你传进来这个key吗。哎,正好这个P白六一颠倒。啊,这个要注意哈,好,那这个完事,那这个完事之后呢,我们再来再来看一下这个driver,我们需要修改哪些。很显然,Driver,我们的map输出,嗯,Map输出在这map输出的位置一定要变,因为它的key和value已经变了。对吧,因为map输出的key变成的是flow b。反而呢,这个Y流变的是past。这样吗?现在呢,就改完了,那改完之后啊,它的输入数据是谁。
14:01
对吧,来输入数据,输入数据是上一个序列化这个案例的结果,对吧,那我们得处理一下啊,上一个输出案例的结果,那这里面怎么办呢?你得把这三样啊给删掉,要不然这个CRC啊,它会参与这个里面啊,它就会认为是输入文件把它干掉。就行了,哎,只留一个帕帕啊PART0,那PART0那这个呢,作为输入路径。C。好放到这里面。转移。转移。哎,我是不是站错了,嗯,来撤回来啊撤销。撤销这里面把这个啊。对吧,哎,这个就OK了,那OK之后呢,它输出路径,那我输出到五吧,啊输出到五。可以吧,嗯,那我们现在来执行一下看看效果。执行完毕了,我们来看一下,这是out put4输入文件,OUTUT5输出打开。
15:04
你看这就是我们得到的倒序,按照总流量的一个倒序排序,那我们看一下总流量是不是倒序啊,嗯,它比它小,它比它小,它比它小,它比它小。对吧,哎一直都是,嗯,降序降序降序降序没问题吧,哎,都是这个按照总流量进行一个降序排序。
我来说两句