默认情况下,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、打开qq。2、点一下左上方的头像照片。3、我的QQ钱夹。4、挑选右上方的设置图标。5、实名验证。6、帐户改名。7、依照步骤进行验证改动就可以。 知名品牌型号规格:iPhone12 系统软件:IOS...
开启格式工厂,点一下MP4,把视频文件格式拖到手机软件中,点一下輸出配备,自主设定主要参数,点一下明确,明确,点一下逐渐,等候缩小进行就可以。 知名品牌型号规格:想到GeekPro 2020 系统软件...
马犬体型匀称,流畅,属于比利时牧羊犬中唯一一种短毛犬种,马犬的智商高,服从性也比较高,对主人非常的忠诚,所以现在也被很多国家引进作为军犬,警犬。也有很多人饲养马犬作为宠物犬,那么马犬好养吗?有什么优点...
本文目录一览: 1、世界上最厉害黑客 2、世界上最厉害的黑客是谁? 3、最厉害的黑客是谁? 4、史上最厉害的黑客是谁? 世界上最厉害黑客 李纳斯·托沃兹(Linus Torvalds)...