默认情况下,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中声明的一致
接下来我们通过示例,可以很直观的了解二次排序的原理
“这就是中华民族,什么都压不倒!” “解放军不应该喊疼,不能怕疼!” “除了胜利,别无选择!” …… 回顾2020,总有一句话让人念念不忘。 戳图 ↓↓↓ ...
电表节电器的节电原理是什么?电表节电器是一种小型通用的节电保护装置,它通过抑制瞬变浪涌,消除因瞬变浪涌不断冲击线路而积累的积碳,畅通线路电流,降低电器、线路温度,改善功率因素等方式来实现对电器的保护和...
微信刚刚推出的时候,相信很多人都以为微信QQ类似,然后...
一、接单快搜问答怎么找黑客 1、黑留言网站都在哪里有一次,当他在网吧上网时,他看到一篇文章说,出售黑客软件可以攻击任何网站,直到它瘫痪为止。接单快搜问答聚集地黑客们建造了英特尼。找网站接单当然,也有必...
连年来饮品行业得以迅速成长,追求康健糊口的人们,逐渐将传统的奶茶剔除日常康健糊口的领域,已经徐徐被鲜榨果汁所替代,如今市面上的鲜榨果汁是深受现代人的青睐,不管是大人小孩,照旧老人,都长短常喜欢和鲜榨果...
近日,中国人民银行印发了《关于核查失效居民身份证信息和非居民身份证件信息试点工作的通知》,天津等6省市将开展银行联网核查失效居民身份证信息和非居民身份证件信息试点工作。 《通知》明确,自2018年4...