美文网首页
全排序案例

全排序案例

作者: bullion | 来源:发表于2019-01-23 14:23 被阅读0次

    FlowBean

    public class FlowBean implements WritableComparable<FlowBean> {

        private long upFlow;    //上行流量

        private long downFlow;  //下行流量

        private long sumFlow;  //总流量

        public FlowBean() {

            super();

        }

        public FlowBean(long upFlow, long downFlow) {

            super();

            this.upFlow = upFlow;

            this.downFlow = downFlow;

            sumFlow = upFlow + downFlow;

        }

        //比较

        @Override

        public int compareTo(FlowBean bean) {

            int result;

            //核心比较条件判断

            if (sumFlow > bean.getSumFlow()) {

                result = -1;

            } else if (sumFlow < bean.getSumFlow()) {

                result = 1;

            } else {

                result = 0;

            }

            return result;

        }

        //序列化

        @Override

        public void write(DataOutput out) throws IOException {

            out.writeLong(upFlow);

            out.writeLong(downFlow);

            out.writeLong(sumFlow);

        }

        //反序列化

        @Override

        public void readFields(DataInput in) throws IOException {

            upFlow = in.readLong();

            downFlow = in.readLong();

            sumFlow = in.readLong();

        }

        public long getUpFlow() {

            return upFlow;

        }

        public void setUpFlow(long upFlow) {

            this.upFlow = upFlow;

        }

        public long getDownFlow() {

            return downFlow;

        }

        public void setDownFlow(long downFlow) {

            this.downFlow = downFlow;

        }

        public long getSumFlow() {

            return sumFlow;

        }

        public void setSumFlow(long sumFlow) {

            this.sumFlow = sumFlow;

        }

        @Override

        public String toString() {

            return upFlow + "\t" + downFlow + "\t" + sumFlow;

        }

    }

    FlowCountSortMapper

    public class FlowCountSortMapper extends Mapper<LongWritable, Text, FlowBean, Text> {

        FlowBean k = new FlowBean();

        Text v = new Text();

        @Override

        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

            // 1 获取一行

            String line = value.toString();

            // 2 切割

            String[] fields = line.split("\t");

            // 3 封装对象

            String phoneNum = fields[0];

            long upFlow = Long.parseLong(fields[1]);

            long downFlow = Long.parseLong(fields[2]);

            long sumFlow = Long.parseLong(fields[3]);

            k.setDownFlow(downFlow);

            k.setUpFlow(upFlow);

            k.setSumFlow(sumFlow);

            v.set(phoneNum);

            // 4 写出

            context.write(k, v);

        }

    }

    FlowCountSortReducer

    public class FlowCountSortReducer extends Reducer<FlowBean, Text, Text, FlowBean> {

        @Override

        protected void reduce(FlowBean key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

            for (Text value:values) {

                context.write(value, key);

            }

        }

    }

    FlowCountSortDriver

    public class FlowCountSortDriver {

        public static void main(String[] args) throws Exception {

            //输入输出路径需要根据自己电脑上的实际的输入输出路径设置

            args = new String[]{"e:/input/output1", "e:/output1"};

            // 1 获取job对象

            Configuration configuration = new Configuration();

            Job job = Job.getInstance(configuration);

            // 6 设置jar包存储位置 关联自定义的mapper和reducer

            job.setJarByClass(FlowCountSortDriver.class);

            // 2 指定本业务job要使用的mapper/Reducer业务类

            job.setMapperClass(FlowCountSortMapper.class);

            job.setReducerClass(FlowCountSortReducer.class);

            // 3 指定mapper输出数据的kv类型

            job.setMapOutputKeyClass(FlowBean.class);

            job.setMapOutputValueClass(Text.class);

            // 4 指定最终输出的数据的kv类型

            job.setOutputKeyClass(Text.class);

            job.setMapOutputValueClass(FlowBean.class);

            // 5 指定job的输入原始文件类型

            FileInputFormat.setInputPaths(job, new Path(args[0]));

            FileOutputFormat.setOutputPath(job, new Path(args[1]));

            // 6 提交job

            boolean result = job.waitForCompletion(true);

            System.exit(result ? 0 : 1);

        }

    }

    相关文章

      网友评论

          本文标题:全排序案例

          本文链接:https://www.haomeiwen.com/subject/udijjqtx.html