MapRduce特性:二次排序

本文详细探讨了MapReduce的二次排序,以解决求1920-2020年每年气温最大值的问题。通过创建自定义的ComboKey,实现分区、排序和分组,确保在reduce阶段只需处理每个年份的最大值,从而优化性能。
摘要由CSDN通过智能技术生成

在学习二次排序的过程中,觉得还是很复杂的,写一篇博客分享一下。

一、什么是二次排序?

    二次排序就是对value值进行排序(本身value值是不会排序的)

二、例子分析

    需求:

       求1920-2020年100年间每年气温的最大值。

    问题分析:

        1、这100年的数据每年的气温数据量十分的大

        2、如果在每次在reduce里面对整个气温找最大值的话很消耗时间

    方案:

        为了解决上述分析中的问题,在reduce之前,将所有的气温数据按年份从小到大排列,同一年份中,温度由又大到小排列,这样的话,reduce只要拿同一组中的第一个数据,就得到了当年的最高温度。

    mapreduce流程图:


    详细分析整个过程:

        1、map从reader中读取数据。

package cn.hbmy.hdfs.mr.secondsorttemperature;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class SecondSortTemWCMapper extends Mapper <IntWritable,IntWritable,Combokey,NullWritable>{
    @Override
    protected void map(IntWritable key, IntWritable value, Context context) throws IOException, InterruptedException {
        Combokey combokey = new Combokey();
        combokey.setYear(key.get());
        combokey.setTemp(value.get());
        context.write(combokey,NullWritable.get());
    }
}

        2、由于MapReduce中,只对key,排序不对value排序,为了能够对value进行排序,自己定义一个combokey,成员变量包含key和value,也就是上图中的需要解决地方4 此时K由combokey代替,value为null。下面给出combokey的定义类:

package cn.hbmy.hdfs.mr.secondsorttemperature;

import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

/**
 * 不仅要有可比较的接口,还要实现串行化的接口
 * */
public class Combokey implements WritableComparable<Combokey> {
    private  int year;
    private int temp;

    public int getYear() {
        return year;
    }

    public int getTemp() {
        return temp;
    }

    public void setYear(int year) {
        this.year = year;
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值