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();