(1)输出结果时保证选取两条气温最高的记录
将相同的年月的记录按照温度降序排列,在最终获取结果时,前两条记录一定是气温最高的两天。
(2)获得相同的年月的气温最高的记录
对于Reduce 端拉取的数据,保证Reduce 每次处理的数据为同一年同一个月份的数据,将同年同月的数据排序(这个阶段可由Group 来处理),取前两条记录,即为该年该月气温最高的前两条记录。
(3)编码关键问题解决
传统的WordCount 案例中的排序,是按照MapReduce 程序默认的字典排序规则进行排序,但对于本案例,既要对日期进行升序排列(默认),又要对温度作降序排列,采用如下的方法进行编码。
可以考虑自定义比较方法来实现需求。自定义一个对象(JavaBean),包含年、月、日、温度等四个属性,将该对象的年份相同的一组数据,支配一个Reduce 进行处理(自定义Partition 方法,从数据中可以看出,一共是三个年份,可以考虑将Reduce 的个数设置为“3”,用年属性减去最小的那一年,将其值对“3”取余)。之后,再比较月份,月份相同,再比较温度,温度按照降序排列。(www.xing528.com)
通过以上分析,需要编写以下几个阶段:
①Map 阶段:负责将数据切分,对应存入JavaBean 中。将JavaBean 传入Partition 阶段。
②Partition 阶段:继承Partitioner,复写getpartition()方法,指定相同年份的数据分到同一个Reduce 中。这样一个Reduce 任务对应输出一个文件。
③Sort 阶段:确保每个传递过来的JavaBean,确定排序规则:相同的年份,比较月份;月份相同,比较温度。
④Group 阶段:此阶段为Shuffle Reduce 端的分组排序。
⑤Reduce 阶段:统计每一年、每一个月、每一天的温度,并选择其中温度最高的两条记录。其中,需要注意的是,在Sort 和Group 阶段,必须复写构造方法,因为参考源码可知,如果没有复写构造方法,无法创建实例。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。