zoukankan      html  css  js  c++  java
  • MR案例:分区和排序

    现有一学生成绩数据,格式如下:<学号,姓名,学院,成绩>  //<id, name, institute, grade>

    需求描述:查询成绩大于等于60分的学生数据,按学院分组,组内按成绩从小到大排序。

    使用SQL描述:

    Select  * from table 
             where grade >= 60 
             group by institute 
             order by grade;

    在MR下应该怎么做?

    1.map阶段选择成绩>=60分的学生。

    Class SelectMapper
    
    method map(LongWritable, Text, InfoWritable, Text){
    
       splited[] = value.toString().split(",");   
    
       InfoWritable  =new InfoWritable(splited[2], splited[3]);
    
       TextOut = new  Text(splited[0]+"	"+splited[1]);  
    
        if(splited[3] >=60) //选择成绩满足条件的输出
    
            context.write(InfoWritable, TextOut)
    }

    2.partition阶段按照学生的学院进行分区。【两种选择】

      2.1.覆写基类Partitioner的getPartition()方法

      2.2.覆写默认分区类HashPartition的getPartition()方法,默认是根据key的hash值进行分区的,即学院字段的hash值。

      2.3.对于指定分区的例子必须打成JAR包运行,这是因为在eclipse上其实是local单机模式。会报java.io.IOException: Illegal partition for ...异常(同理于R个数 < 分区个数)。

    //根据 分区函数 的返回值产生相应编号的结果文件part-r-0000*
    //如返回值为 3 ,则对应 part-r-00003 结果文件 job.setPartitionerClass(ProviderPartitioner.class);
    //显示指定需要的Reduce个数【应该大于等于分区个数】 //如果 R个数 < 分区个数,报IO异常错误 //如果 R个数 > 分区个数:如指定了4个分区,但运行6个R任务,则返回6个结果文件,其中两个空文件 job.setNumReduceTasks(Integer.parseInt(args[2]));

    3.shuffle阶段按照学生成绩排序

      综合阶段2和3的需求,完全可以自定义Writable类实现分区的hashCode() 排序的compareTo()方法

    Class InfoWritable implements WritableComparable
    
     private int xueyuan; //学院编号字段
    
       private double chengji; //成绩字段
        
       method hashCode(){
            return xueyuan * 18;//hash值只和学院有关,相同学院分到同一个reduce
        }
    
        method compareTo(InfoWritable o){
            if(this.xueyuan.compareTo(o.xueyuan) ==0)  //先按照学院排序(升序)
    
              return this.chengji.compareTo(o.chengji); //再按照成绩排序(升序)
    
            else return this.xueyuan.compareTo(o.xueyuan); 
        }

    4.Reduce阶段

      由于已在 Partition阶段,将相同的学院分到同一个 reduce。并且在 Shuffle 阶段按照成绩排好序,所以reduce阶段只需要输出即可。

    Class SelectReduce 
    
        method reduce(InfoWritable, Texts, Text InfoWritable)
             
            for(Text text : Texts){
                
                   contex.writable(text, InfoWritable)  
            }

    由于特殊原因,只能进行伪代码分析,实际代码有时间补上。

  • 相关阅读:
    CentOS中怎样卸载旧版本Git并安装高版本Git
    下载抖音无水印视频工具 python webdriver 2020.09.02
    axel-2.17.9 aria2c-1.35.0 wget-1.20.3 curl-7.72.0 最新CLI下载工具在win10环境测试下载速度
    wget-1.20.3 static for win32
    undefined reference to `inet_pton' under MSYS
    undefined reference to `gnutls_protocol_set_priority'
    wget2 for windows 2020.08.28
    Unicode转义(uXXXX)的编码和解码 go-nascii 类似于 native2ascii
    正则表达式零宽断言 grep sift ripgrep(rg)
    编译 jq git版本
  • 原文地址:https://www.cnblogs.com/skyl/p/4745134.html
Copyright © 2011-2022 走看看