默认情况下,Map输出的结果会对Key进行默认的排序,但是有时候需要对Key排序的同时还需要对Value进行排序,这时候就要用到二次排序了。下面我们来说说二次排序
1、二次排序原理
我们把二次排序分为以下几个阶段
Map起始阶段
在Map阶段,使用job.setInputFormatClass()定义的InputFormat,将输入的数据集分割成小数据块split,同时InputFormat提供一个RecordReader的实现。在这里我们使用的是TextInputFormat,它提供的RecordReader会将文本的行号作为Key,这一行的文本作为Value。这就是自定 Mapper的输入是<LongWritable,Text> 的原因。然后调用自定义Mapper的map *** ,将一个个<LongWritable,Text>键值对输入给Mapper的map ***
Map最后阶段
在Map阶段的最后,会先调用job.setPartitionerClass()对这个Mapper的输出结果进行分区,每个分区映射到一个Reducer。每个分区内又调用job.setSortComparatorClass()设置的Key比较函数类排序。可以看到,这本身就是一个二次排序。如果没有通过job.setSortComparatorClass()设置 Key比较函数类,则使用Key实现的compareTo() ***
Reduce阶段
在Reduce阶段,reduce() *** 接受所有映射到这个Reduce的map输出后,也会调用job.setSortComparatorClass() *** 设置的Key比较函数类,对所有数据进行排序。然后开始构造一个Key对应的Value迭代器。这时就要用到分组,使用 job.setGroupingComparatorClass() *** 设置分组函数类。只要这个比较器比较的两个Key相同,它们就属于同一组,它们的 Value放在一个Value迭代器,而这个迭代器的Key使用属于同一个组的所有Key的之一个Key。最后就是进入Reducer的 reduce() *** ,reduce() *** 的输入是所有的Key和它的Value迭代器,同样注意输入与输出的类型必须与自定义的Reducer中声明的一致
接下来我们通过示例,可以很直观的了解二次排序的原理
本文导读目录: 1、打听下上海装潢设计公司哪家好??? 2、请问全国室内装修设计公司比较好的都有哪些? 3、南京家庭装修设计公司哪家好 4、国内排名比较好的装饰公司有哪些? 5、十大家...
大家都知道,自打进到网络时代至今,我们的日常生活也发生了天翻地覆的转变,尤其是拥有手机支付后,如今仅有有一部手机就可以进行许多 事儿,例如买东西、订外卖这些,说到手机支付,怎能少得了支付宝钱包呢,做为...
咱们能够经过脚本,从5725MHz到5850MHz进行遍历,每次隔1MHz,刚好掩盖BK5811的每一个频道。 遍历监听时,考虑单个频点的状况,咱们能得到冗余数据(假定监听61号频道)如下:2019...
欠债人靠打工翻不了身,自立门户又没本钱,应该怎么办? 因创业失败,负债累累,因商致贫的朋友们,在现实生活中,总有许多同仁们遇到这样的困惑,很难从其中有一个清醒的认识。 个人负债率太大,...
近期在家里很无聊,很多人都逐渐在家里卤物品吃,卤汁要是没有搞好好,卤出去的物品就不好吃。卤汁发黑表明没卤好。那麼卤汁如何不容易发黑 卤汁怎么保存比较好。产生有关详细介绍。 卤汁如何不容易发黑 卤汁...
本文目录一览: 1、15岁上浙大、22岁获世界冠军的天才黑客疑似被开除,究竟怎么回事? 2、世界顶级的黑客是谁哪个国家? 3、世界上最黑的黑客是谁呢? 4、全球第一黑客是谁? 15岁上浙...