`

MapReduce二次排序实现

阅读更多
    最近在学习使用原生的mapreduce来实现对值的排序。以前使用scalding可以很容易的得到结果。现在靠自己的时候,就非常的犯难呢。参考权威指南里的方法:使用的是自定义的key来实现。

    原因是hadoop只支持key上的排序。因此,我们可以自定义一种复合的key,并同时定义这个key的比较方法(重载compareTo方法)。以下是这个key的一种实现:

  
public class IntPair  implements WritableComparable<IntPair>{
    public Text first;
    public IntWritable second;
    public IntPair(){
        super();
        this.set(new Text(),new IntWritable());
    }
    public IntPair(String key, int value){
        super();
        this.set(key,value);
    }
    public void set(Text key,IntWritable value){
        this.first=key;
        this.second=value;
    }
    public void set(String key,int value){
        this.first=new Text(key);
        this.second = new IntWritable(value);
    }
     
    @Override
    public void write(DataOutput out) throws IOException {
        this.first.write(out);
        this.second.write(out);
    }
    @Override
    public void readFields(DataInput in) throws IOException {
        this.first.readFields(in);
        this.second.readFields(in);
    }
    @Override
    public int compareTo(IntPair o) {
        int value1= this.second.get();
        int value2= o.second.get();
        if(value1==value2){
            return this.first.compareTo(o.first);
        }else{
            return value1-value2;  //升序排列 ,反过来就是降序排列
        }
      }
     
    @Override
     public boolean equals(Object o) {
        if (o instanceof IntPair) {
            return this.first.equals(((IntPair) o).first)&&(this.second.equals(((IntPair) o).second));
        } else {
          return false;
        }
      }
    @Override
    public String toString() { 
        return this.first+"\t"+this.second;
    }
     
    @Override
      public int hashCode() {
        return first.toString().hashCode() + second.toString().hashCode();
      }
}
    


    如果在某些情况下,我们希望调用另外的key类比较实现,那么可以额外定义一个comparator,并重载compare方法。代码如下:   根据compareTo方法显示,这个IntPair试图实现对second的值先进行升序排列,如果值相同,则进行first值的排序。以上的代码请注意toString方法是用来输出时调用的。否则无法正确打印这个key。在进入map的输出阶段时,会默认调用Key类的compareTo方法进行排序。

注意:
     在构造函数的时候使用super(IntPair.class,true)。如果第二个参数为false或者使用super(IntPair.class)则会导致空指针异常。
分享到:
评论

相关推荐

    mapreduce二次排序

    当我们需要对数据进行复杂的排序需求时,例如“年份升序,按照年份聚合,气温降序”,MapReduce的二次排序(Secondary Sort)机制就显得尤为重要。这个概念主要解决的是在MapReduce默认排序规则基础上,进行更精细化...

    MapReduce二次排序

    MapReduce二次排序代码实现。 二次排序这里指:在以key为关键字的排序基础上,同时按照value排序

    MapReduce模型--二次排序

    MapReduce模型中的二次排序是大数据处理中一项重要的技术,它通过多层排序功能来优化数据处理性能。二次排序的核心思想在于对Key(键)进行分层排序,而不能对Value(值)进行排序。这主要是因为MapReduce框架设计时...

    大数据学习资料全排序二次排序

    5. 实际案例展示如何在Hadoop中实现二次排序 6. 图形化解释帮助理解数据处理流程 通过对这些内容的学习,读者可以深入理解大数据排序的复杂性和Hadoop在其中的角色,进一步提升大数据处理的能力。

    hadoop 二次排序 原理

    在Hadoop MapReduce的早期版本(0.20.0之前),二次排序通常通过设置`setPartitionerClass`、`setOutputKeyComparatorClass`和`setOutputValueGroupingComparator`来实现。而在0.20.0及之后的版本,这些设置被替换为...

    hadoop分区二次排序示例.zip

    在这个“hadoop分区二次排序示例.zip”压缩包中,我们重点探讨的是如何在Hadoop MapReduce中实现特定的排序逻辑,即二次排序和分区策略。 首先,我们需要理解什么是二次排序。在标准的MapReduce流程中,数据经过map...

    hadoop 二次排序 插入数据库

    这篇博客文章(虽然链接无法直接访问,但我们可以根据常规知识来解释这个概念)可能探讨了如何实现Hadoop MapReduce任务中的二次排序,并将其结果插入到数据库中。 **一、Hadoop二次排序** 在Hadoop MapReduce的...

    云应用系统开发第二次项目(mapreduce)

    15. 使用 MapReduce 实现二次排序:使用 MapReduce 来实现数据的二次排序,以便对数据进行复杂的排序处理。 该项目旨在掌握 MapReduce 编程模型的基本概念和应用,并涵盖了 MapReduce 的高级应用,旨在提高学生对云...

    mapreduce secondarysort

    通过对MapReduce二次排序原理的理解以及具体实现细节的分析,我们可以看到二次排序在MapReduce框架中的重要性和其实现的复杂性。通过合理配置排序和分组比较器,可以有效地实现复杂的排序需求,从而提高数据处理的...

    大数据MapReduce和YARN二次开发.pdf

    大数据MapReduce和YARN二次开发是大数据处理技术的重要组成部分,能够快速实现大规模数据的处理和分析。MapReduce提供了一个灵活的框架,开发者可以通过MR开发接口实现自己的Map和Reduce函数,以满足不同的大数据...

    MapReduce的小应用

    - 二次排序仅适用于一步到位的MapReduce任务,不支持在Map阶段结束后对keys的任意值进行修改。 - 不可同时使用`org.apache.hadoop.mapred`和`org.apache.hadoop.mapreduce`包,这可能导致不便。 - MapReduce中间结果...

    拓思爱诺大数据-第二次作业MapReduce编程

    在“拓思爱诺大数据-第二次作业MapReduce编程”中,你将学习到如何使用MapReduce解决实际问题。首先,我们来看Hadoop的wordcount程序,这是一个经典的MapReduce示例,用于统计文本中单词出现的频率。在Map阶段,程序...

    Hadoop技术内幕:深入解析MapReduce架构设计与实现原理

    对于那些对Hadoop二次开发感兴趣的读者,书中对于Hadoop设计原理的深入剖析,可以帮助他们更好地理解整个Hadoop框架的设计,从而在二次开发时更加得心应手。而应用开发工程师和运维工程师也可以通过这本书了解到如何...

    基于MapReduce的矩阵相乘算法代码及其使用

    此外,通过对 Mapper 和 Reducer 类的具体实现,我们可以更深入地理解 MapReduce 的工作原理及其实现细节。在实际应用中,这种方法可以极大地提高数据处理的效率,特别是在处理大规模数据集时更为明显。

    hadoop二次排序的原理和实现方法

    2. 二次排序实现步骤: - 自定义Key:创建一个复合类,如`IntPair`,它实现`WritableComparable`接口。这个类包含两个字段,用于存储需要排序的两个部分。`IntPair`需要重写`readFields()`、`write()`、`compareTo...

    java大数据作业_5Mapreduce、数据挖掘

    【Java大数据作业_5Mapreduce、数据挖掘】的课后作业涵盖了多个MapReduce和大数据处理的关键知识点,包括日志分析、Job执行模式、HBase的相关类、容量调度配置、MapReduce流程以及二次排序算法。下面将对这些内容...

    Hadoop技术内幕:深入解析MapReduce架构设计与实现原理 -董西成 可复制 电子书+pdf

    6. **Reducer**:Reducer是MapReduce的第二个阶段,它接收来自Mapper的中间键值对,按照键进行分组,然后对每个键的所有值执行聚合操作。Reducer通常用于汇总数据或执行统计计算。 7. **Shuffle和Sort**:在Mapper...

    大数据mapreduce案例

    除了基本的MapReduce模型,还有一些优化策略可以提高性能,例如Combiner(本地化Reduce)、Partitioner(自定义分区)和Secondary Sort(二次排序)等。这些技巧可以在不改变最终结果的情况下,减少数据传输量,提高...

    云计算 mapreduce - <Data-Intensive[1].Text.Processing.With.MapReduce>

    - **二次排序**:阐述在MapReduce作业中如何实现更复杂的排序需求。 - **关系连接**:探索如何使用MapReduce执行类似于SQL中的JOIN操作。 3. **用于文本检索的倒排索引** - **倒排索引**:解释倒排索引的基本...

Global site tag (gtag.js) - Google Analytics