默认情况下,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、我的电脑给人家黑客攻击怎...
IPC$是NT/2000的一项新功能,它有一个特点,即在同一时间内,两个IP之间只允许建立一个连接。简单点说就是通过你的系统帐号和密码登陆你的系统的一个通道!而 IPC$ 并不算是一个漏洞,但因一般电...
2020年选调生考试即将逐渐,很多人都说选调生是个深坑,千万不要考选调生,也会出现很多人都是在会担忧选调生考入之后是否要到农村基层去工作中5年啊?标准是否会尤其艰难啊?下来之后是否沒有“方式”便会在城...
本文导读目录: 1、工厂怎么实现远程监控? 2、黑客是怎么监控电脑的呀? 3、特斯拉上海工厂摄像头被入侵,黑客为何敢这么明目张胆的入侵? 4、黑客 所谓的黑客远程控制别人的电脑,在别人的电...
本文导读目录: 1、怎样评价《黑客帝国》三部曲? 2、求一些IMDB评分很高的(至少7.0)关于特工去破坏邪恶组织的电影 3、黑客帝国1、2、3票房分别为多少? 4、美国科幻大片 5、...
怎么样查老公和别人聊天记录(老公和小三的聊天记录怎么查)夫妻应该相互信任的。就像你说的,心始终不变,既然不变就要相信你老公的为人。婚姻最忌猜疑。祝幸福一生不要和谐社会你想表达什么老公与小三的聊天记录...