MapReduce当中排序sort的方法

本文介绍如何使用Hadoop MapReduce技术框架实现排序功能,通过自定义类OrderBeanSort实现WritableComparable接口,以支持按id和amount字段进行排序。文章提供了完整的代码示例。

排序sort:

防盗版实名手机尾号:73203。注意:想自己实现Sort得不偿失,但如想借助Hadoop MapReduce技术框架排序,key必须实现WritableComparable接口。具体做法见下。需求是先按id比,再按amount比。
package com;
import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public class OrderBeanSort implements WritableComparable<OrderBeanSort>{
    private String orderId;
    private Double amount;
    private Double average=0.0;
    public Double getAverage() {
        return average;
    }
    public void setAverage(Double average) {
        this.average = average;
    }
    public OrderBeanSort() {
    }

    public OrderBeanSort(String orderId, Double amount) {
        this.orderId = orderId;
        this.amount = amount;
    }
    public void set(String orderId, Double amount) {
        this.orderId = orderId;
        this.amount = amount;
    }
    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public Double getAmount() {
        return amount;
    }

    public void setAmount(Double amount) {
        this.amount = amount;
    }

    public void write(DataOutput out) throws IOException {
        out.writeUTF(orderId);
        out.writeDouble(amount);
        out.writeDouble(average);
    }

  更多请见:http://www.mark-to-win.com/tutorial/mydb_MapReduce_Sort.html

### MapReduce 中分组和排序的实现方法 #### 分组与排序的概念 在MapReduce框架中,分组和排序是两个紧密关联的操作。为了确保数据能够被正确地分配给Reducer,并且在同一键下的所有记录可以按预期顺序处理,这两个过程至关重要。 - **排序**发生在Shuffle阶段之前,在此期间所有的中间Key会被收集起来并通过网络发送至相应的Reducer节点上;而在此之前这些Keys会依据自然字典序或者用户自定义的方式进行排列。 - **分组**则是在Sort之后由系统自动完成或是通过设置`GroupingComparator`来自定义逻辑来决定哪些具有相同特性的Keys应该归入一组以便于后续聚合计算[^1]。 #### 自定义排序实例解析 对于特定应用场景下可能需要更复杂的排序规则而非简单的基于单个字段升/降序的情况,则可以通过扩展`WritableComparable`接口创建新的类用于表示待排序实体——比如案例里提到的状态(State)+病例数量(Case Number),并重写其内部的方法以体现所需的优先级关系: ```java public class Case implements WritableComparable<Case> { private String state; private Integer caseNumber; // Getters and Setters omitted for brevity @Override public int compareTo(Case other) { int cmp = this.state.compareTo(other.getState()); if (cmp != 0){ return cmp; } return -(this.caseNumber).compareTo(other.getCaseNumber()); // Descending order of cases within same state. } } ``` 上述代码片段展示了如何在一个复合型结构体(即包含多个属性的对象)之间建立比较机制,这里先是按照州名称做主要区分标准,再针对同属一地区的条目依感染人数多少反向排队[^2]。 #### 使用 Combiner 减少冗余传输 除了基本功能外,有时还可以引入额外组件如Combiner进一步优化性能表现。它的工作原理类似于局部汇总器,在Mapper结束工作后立即启动对本地产生的临时文件实施初步规约动作,以此减少不必要的跨节点间通信开销以及减轻下游处理器负担[^3]。 #### 定制化 `GroupingComparator` 如果默认行为无法满足业务需求的话,那么就可以考虑借助`GroupingComparator`来进行更加精细粒度上的控制。这允许开发者指定怎样才算作“相等”的key值组合形式,进而影响到最终输出结果集内的元素构成情况。例如下面给出了一段关于统计各省份topN热门商品销售排行榜时所使用的比较器源码示例: ```java import org.apache.hadoop.io.WritableComparable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; public class ProductSalesGroupingComparator extends WritableComparator { protected ProductSalesGroupingComparator() { super(ProductSaleRecord.class, true); } @Override public int compare(WritableComparable wc1, WritableComparable wc2) { ProductSaleRecord psr1 = (ProductSaleRecord)wc1; ProductSaleRecord psr2 = (ProductSaleRecord)wc2; return psr1.province.equals(psr2.province)?psr1.productName.compareTo(psr2.productName):psr1.province.compareTo(psr2.province); } } ``` 这段程序说明了即使两件产品的销量完全一致也应当归属于不同的类别之中只要它们所属地区不同即可[^4]。 #### 实战演练:Top-N查询场景应用 最后来看一个具体的例子,假设现在要找出每个省销售额最高的前三款产品。为此我们需要设计一套完整的解决方案链路覆盖从输入读取直至最后写出答案的所有环节。其中涉及到的关键技术点就包括但不限于前面已经讨论过的那些方面再加上一些针对性调整措施,像这样: ```java // Define the custom grouping comparator to ensure correct groupings at reducer side. public static class TopNSalesPerProvinceGroupingComparator extends WritableComparator { ... } // Implement map function that emits intermediate key-value pairs with province as part of composite keys alongside product info & sales amount. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{ ... } // Reduce phase where top n items per category are selected after sorting them based on sale figures inside each partition defined by our customized logic above. protected void reduce(Text key, Iterable<Text> values, Context context)throws IOException ,InterruptedException{ ... } ``` 以上就是有关MapReduce环境下开展高效分组加排序工作的详细介绍[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值