hadoop中关于reduce参数values遍历导致key值变化和遍历中value对象是一个的问题源码分析

hadoop中关于reduce参数values遍历导致key值变化和遍历中value对象是一个的问题分析

一,问题发现

1,遍历reduce中的values参数 key值也会随之变化

假设有如下需求:有一批订单 一个订单有多个商品 现在需要根据订单id分组 在把一组订单中的商品按照价格排序

mapper代码

/**
 * @ClassName Job13Mapper
 * @Description 读取订单数据转换成Job13Data订单对象 和DoubleWritable订单金额 输出
 * @Author liangfeng
 * @Date 2019-06-28 22:53
 * @Version 1.0
 **/
public class Job13Mapper extends Mapper<LongWritable, Text, Job13Data, DoubleWritable> {

    Job13Data job13Data;
    DoubleWritable doubleWritable;

    @Override
    protected void setup(Context context) throws IOException, InterruptedException {
        job13Data = new Job13Data();
        doubleWritable = new DoubleWritable();
    }

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] split = value.toString().split("\t");
        job13Data.setOrderId(split[0]);//取订单id
        job13Data.setPrice(Double.valueOf(split[2]));//取订单金额
        System.out.println(job13Data.toString());
        doubleWritable.set(job13Data.getPrice());
        context.write(job13Data,doubleWritable);//
    }
}

job13bean

/**
 * @ClassName Job13Data
 * @Description 订单bean 实现WritableComparable 实现根据price排序
 * @Author liangfeng
 * @Date 2019-06-28 22:59
 * @Version 1.0
 **/
public class Job13Data implements WritableComparable<Job13Data> {

    private String orderId;
    private Double price;

    public String getOrderId() {
        return orderId;
    }

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

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    /**
     * @Description: 相同订单金额比较
     * @Param null
     * @return:
     * @Author: liangfeng
     * @Date: 2019-07-09 12:07
     */
    @Override
    public int compareTo(Job13Data o) {
        if(orderId.equals(o.orderId)){
            int i = this.price.compareTo(o.getPrice());
            return -i;
        }
        return 0;
    }

    @Override
    public void write(DataOutput out) throws IOException {
        out.writeUTF(orderId);
        out.writeDouble(price);
    }

    @Override
    public void readFields(DataInput in) throws IOException {
        this.orderId = in.readUTF();
        this.price = in.readDouble();
    }

    /**
     * @Description: 输出文本格式
     * @Param null
     * @return:
     * @Author: liangfeng
     * @Date: 2019-07-09 12:08
     */

    @Override
    public String toString() {
        return orderId+"\t"+price;
    }
}

Job13Partitioner 分区

/**
 * @ClassName Job13Partitioner
 * @Description 根据订单id分区
 * @Author liangfeng
 * @Date 2019-06-28 23:18
 * @Version 1.0
 **/
public class Job13Partitioner extends Partitioner<Job13Data, DoubleWritable> {
    @Override
    public int getPartition(Job13Data job13Data, DoubleWritable doubleWritable, int numPartitions) {
        String orderId = job13Data.getOrderId();
 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值