默认情况下,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中声明的一致
接下来我们通过示例,可以很直观的了解二次排序的原理
编辑导语:HMW:How might we,警惕了Design Hackathon中的一种要领,主要合用于脑子风暴前去寻找办理问题的偏向,扩展思路,而不是范围在详细的办理方案里,在产物新成果设计中应用...
大家中的很多人会考虑到成千上万网络威胁,直至电脑中病毒时。 除非是大家的一台电子计算机非常容易遭受病原体,恶意程序或黑客入侵的威协,不然大家趋向于将网络信息安全放到第一位。 可是,如同所有人都遭受普遍...
影响版本:OpenCart 1.1.8漏洞描述:BUGTRAQ ID: 34121 OpenCart是基于PHP的开源在线购物车系统。 OpenCart没有正确地过滤用户所提交的order URL参...
老四大天王(天堂好走58岁刘德华确诊) 许冠杰,香港歌、影、艺的红人,他的传奇横跨三个十年。他是现代粤语流行曲的最大功臣,完成粤语歌曲从古典到现代流行的嫁接,同时带动香港流行唱片/演唱会的发展;...
王者荣耀有很多周边玩法,比如说有一个虚拟的团队,叫做无限王者团,这个团队成员是王者荣耀中的花样美男,有李白、诸葛亮、韩信、赵云等,那么今年5月3日,是无限王者团成团多少周年呢?这是王者荣耀微信2020...
往事输了好多钱怎么办,往事输钱不要慌黑客带你还款。 我希望每个人都尽快离开赌博,意识到他的危害。现在,我经历了前面的起起落落,我从后面的痛苦经历中学到了东西。我一次又一次地失去的钱已经赚回来了。现...