WritableComparable

 

WritableComparable继承自Writable和java.lang.Comparable接口,是一个Writable也是一个Comparable,也就是说,既可以序列化,也可以比较!

WritableComparable的实现类之间相互来比较,在Map/Reduce中,任何用作键来使用的类都应该实现WritableComparable接口!

/*

输入:
order01,pro01,220.8
order01,pro02,220.1
order01,pro03,220.3
order02,pro04,221.8
order02,pro05,222.8
order03,pro06,220.2
order04,pro07,220.8
输出:
orderId='order01', productId='pro01', price=220.8
orderId='order02', productId='pro05', price=222.8
orderId='order03', productId='pro06', price=220.2
orderId='order04', productId='pro07', price=220.8
 */
计算每个订单的price的最大值
(1)price排序(orderBean.compareTo【二次排序】)
(2)按订单分组(groupingComparator)

 

 

 


package com.atguigu.groupingComparator;

import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class OrderBean implements WritableComparable<OrderBean> {

    private String orderId;
    private String productId;
    private double price;

    @Override
    public String toString() {
        return "orderId='" + orderId + '\'' + ", productId='" + productId + '\'' + ", price=" + price;
    }

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

    public void setProductId(String productId) {
        this.productId = productId;
    }

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

    public String getOrderId() {
        return orderId;
    }

    public String getProductId() {
        return productId;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public int compareTo(OrderBean o) {
        //二次排序
        int compare = this.orderId.compareTo(o.orderId);  //比较订单id
        if(compare == 0){
            return Double.compare(o.price,this.price); //订单相同,按照价格排序
        }else{
            return compare;
        }

    }

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

    }

    @Override
    public void readFields(DataInput in) throws IOException {

        orderId = in.readUTF();
        productId = in.readUTF();
        price = in.readDouble();

    }
}
package com.atguigu.groupingComparator;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;

public class OrderComparator extends WritableComparator {

    protected OrderComparator(){
        super(OrderBean.class,true);
    }
    @Override
    public int compare(WritableComparable a, WritableComparable b) {
        OrderBean oa =(OrderBean) a;
        OrderBean ob =(OrderBean) b;

        return oa.getOrderId().compareTo(ob.getOrderId());
    }
}
package com.atguigu.groupingComparator;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class OrderDriver {
    public static void main(String[] args) throws Exception {
        Job job = Job.getInstance(new Configuration());

        job.setJarByClass(OrderDriver.class);

        job.setMapperClass(OrderMapper.class);
        job.setReducerClass(OrderReducer.class);

        job.setMapOutputKeyClass(OrderBean.class);
        job.setMapOutputValueClass(NullWritable.class);

        job.setOutputKeyClass(OrderBean.class);
        job.setOutputValueClass(NullWritable.class);

        //增加Comparator
        job.setGroupingComparatorClass(OrderComparator.class);

        FileInputFormat.setInputPaths(job,new Path("E:\\order.txt"));
        FileOutputFormat.setOutputPath(job,new Path("E:\\out4"));

        boolean b = job.waitForCompletion(true);
        System.exit(b?0:1);
    }
}

package com.atguigu.groupingComparator;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class OrderMapper extends Mapper<LongWritable, Text,OrderBean, NullWritable> {
    private OrderBean orderBean = new OrderBean();
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] fields = value.toString().split(",");

        orderBean.setOrderId(fields[0]);
        orderBean.setProductId(fields[1]);
        orderBean.setPrice(Double.parseDouble(fields[2]));

        context.write(orderBean,NullWritable.get());
    }
}
 

 

package com.atguigu.groupingComparator;

import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.Iterator;

public class OrderReducer extends Reducer<OrderBean, NullWritable,OrderBean,NullWritable> {
    //取最大值
//    @Override
//    protected void reduce(OrderBean key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
//        context.write(key,NullWritable.get());
//    }

    //取前两名
    @Override
    protected void reduce(OrderBean key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
        Iterator<NullWritable> iterator = values.iterator();
        for(int i=0;i<2;i++){
            if(iterator.hasNext()){
                context.write(key,iterator.next());
            }
        }
    }
}

 

posted on 2020-11-17 16:44  happygril3  阅读(222)  评论(0)    收藏  举报

导航