第2节 mapreduce深入学习:8、手机流量汇总求和

例子:MapReduce综合练习之上网流量统计。

数据格式参见资料夹

需求一:统计求和

统计每个手机号的上行流量总和,下行流量总和,上行总流量之和,下行总流量之和

分析:以手机号码作为key值,上行流量,下行流量,上行总流量,下行总流量四个字段作为value值,然后以这个key,和value作为map阶段的输出,reduce阶段的输入。

data_flow.dat内容类似下面的:

1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 游戏娱乐 24 27 2481 24681 200

字段说明:

注意:将相同手机号的数据放到一起,以手机号作为key2!

代码:

FlowMain:
package cn.itcast.demo3.flowCount;

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.conf.Configured;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.lib.input.TextInputFormat;import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;import org.apache.hadoop.util.Tool;import org.apache.hadoop.util.ToolRunner;

public class FlowMain extends Configured implements Tool {    @Override    public int run(String[] args) throws Exception {

        Job job = Job.getInstance(this.getConf(), FlowMain.class.getSimpleName());//        job.setJarByClass(FlowMain.class);

        job.setInputFormatClass(TextInputFormat.class);        TextInputFormat.addInputPath(job,new Path("file:///D:\\Study\\BigData\\heima\\stage2\\4、大数据离线第四天\\流量统计\\input\\data_flow.dat"));

        job.setMapperClass(FlowMapper.class);        job.setMapOutputKeyClass(Text.class);        job.setMapOutputValueClass(FlowBean.class);

        job.setReducerClass(FlowReducer.class);        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(FlowBean.class);

        job.setOutputFormatClass(TextOutputFormat.class);        TextOutputFormat.setOutputPath(job,new Path("file:///D:\\Study\\BigData\\heima\\stage2\\4、大数据离线第四天\\流量统计\\1sum"));

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

    public static void main(String[] args) throws Exception {        int run = ToolRunner.run(new Configuration(), new FlowMain(), args);        System.exit(run);    }}
FlowMapper:
package cn.itcast.demo3.flowCount;

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

import java.io.IOException;

public class FlowMapper extends Mapper<LongWritable,Text,Text,FlowBean> {    //1363157985066    13726230503    00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com   游戏娱乐   24 27 2481   24681  200    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        FlowBean flowBean = new FlowBean();

        String[] split = value.toString().split("\t");

        flowBean.setUpFlow(Integer.parseInt(split[6]));//上行流量        flowBean.setDownFlow(Integer.parseInt(split[7]));//下行流量        flowBean.setUpCountFlow(Integer.parseInt(split[8]));//上行总流量        flowBean.setDownCountFlow(Integer.parseInt(split[9]));//下行总流量        //split[1] 手机号        //往下一阶段写出我们的数据,key2  是手机号  value2  我们自己封装定义的javaBean        context.write(new Text(split[1]),flowBean);    }}
FlowReducer:
package cn.itcast.demo3.flowCount;

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

import java.io.IOException;

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

    @Override    protected void reduce(Text key, Iterable<FlowBean> values, Context context) throws IOException, InterruptedException {        //上行流量        int  upFlow = 0;        //下行流量        int  downFlow = 0;        //上行总流量        int  upCountFlow = 0;        //下行总流量        int  downCountFlow = 0;

        for(FlowBean flowBean:values){            upFlow += flowBean.getUpFlow();            downFlow += flowBean.getDownFlow();            upCountFlow += flowBean.getUpCountFlow();            downCountFlow += flowBean.getDownCountFlow();        }

        FlowBean flowBean = new FlowBean();        flowBean.setUpFlow(upFlow);        flowBean.setDownFlow(downFlow);        flowBean.setUpCountFlow(upCountFlow);        flowBean.setDownCountFlow(downCountFlow);

        context.write(key,flowBean);

    }}
FlowBean:
package cn.itcast.demo3.flowCount;

import org.apache.hadoop.io.Writable;

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

/** * 这里暂时不需要做排序,所以直接实现writable接口就可以了 */public class FlowBean implements Writable {    //上行流量    private Integer  upFlow;    //下行流量    private Integer  downFlow;    //上行总流量    private Integer  upCountFlow;    //下行总流量    private Integer  downCountFlow;

    /**     * 序列化方法     * @param out     * @throws IOException     */    @Override    public void write(DataOutput out) throws IOException {        out.writeInt(this.upFlow);        out.writeInt(this.downFlow);        out.writeInt(this.upCountFlow);        out.writeInt(this.downCountFlow);    }

    /**     * 反序列化的方法     * @param in     * @throws IOException     */    @Override    public void readFields(DataInput in) throws IOException {        this.upFlow = in.readInt();        this.downFlow = in.readInt();        this.upCountFlow = in.readInt();        this.downCountFlow = in.readInt();    }

    public void setUpFlow(Integer upFlow) {        this.upFlow = upFlow;    }

    public void setDownFlow(Integer downFlow) {        this.downFlow = downFlow;    }

    public void setUpCountFlow(Integer upCountFlow) {        this.upCountFlow = upCountFlow;    }

    public void setDownCountFlow(Integer downCountFlow) {        this.downCountFlow = downCountFlow;    }

    public Integer getUpFlow() {        return upFlow;    }

    public Integer getDownFlow() {        return downFlow;    }

    public Integer getUpCountFlow() {        return upCountFlow;    }

    public Integer getDownCountFlow() {        return downCountFlow;    }

    @Override    public String toString() {        return "上行流量=" + upFlow +                ", 下行流量=" + downFlow +                ", 上行总流量=" + upCountFlow +                ", 下行总流量=" + downCountFlow;    }}

运行结果类似于:

13480253104 上行流量=3, 下行流量=3, 上行总流量=180, 下行总流量=180

原文地址:https://www.cnblogs.com/mediocreWorld/p/11025858.html

时间: 2024-10-08 04:33:46

第2节 mapreduce深入学习:8、手机流量汇总求和的相关文章

第2节 mapreduce深入学习:7、MapReduce的规约过程combiner

每一个 map 都可能会产生大量的本地输出,Combiner 的作用就是对 map 端的输出先做一次合并,以减少在 map 和 reduce 节点之间的数据传输量,以提高网络IO 性能,是 MapReduce 的一种优化手段之一. ?   combiner 是 MR 程序中 Mapper 和 Reducer 之外的一种组件 ?   combiner 组件的父类就是 Reducer ?   combiner 和 reducer 的区别在于运行的位置: Combiner 是在每一个 maptask

第2节 mapreduce深入学习:15、reduce端的join算法的实现

reduce端的join算法: 例子: 商品表数据 product: pidp0001,小米5,1000,2000p0002,锤子T1,1000,3000 订单表数据 order:       pid1001,20150710,p0001,21002,20150710,p0002,31002,20150710,p0003,3 mapReduce可以实现sql语句的功能:select ......from product p left join order o on p.pid = o.pid 思

第2节 mapreduce深入学习:12、reducetask运行机制(多看几遍)

ReduceTask的运行的整个过程 背下来1.启动线程到mapTask那里去拷贝数据,拉取属于每一个reducetask自己内部的数据2.数据的合并,拉取过来的数据进行合并,合并的过程,有可能在内存当中,有可能在磁盘当中,有可能在内存和磁盘当中,合并的时候同时要进行分组操作3.调用reduce逻辑4.数据输出 原文地址:https://www.cnblogs.com/mediocreWorld/p/11028068.html

九(一):手机上网流量汇总求和

对文件中的手机号流量进行汇总: 1363157985066  13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200 1363157995052  13826544101 5C-0E-8B-C7-F1-E0:CMCC 120.197.40.4 4 0 264 0 200 1363157991076  13926435656 20-10-7A-28-CC-0A:CMCC 120.

九(三):手机上网流量汇总求和(排序方式二)

import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.WritableComparable; public class FlowBean implements WritableComparable<FlowBean>{ //电话号码 private String phoneNb; //上传流量 private long flow_u

学习制作手机网站1

学习制作手机网页 流式布局: 盒子的padding 和margin width都要使使用 百分比来定义 百分比 如果一个盒子没有父元素,那么它的宽度默认就是相对于浏览器的宽度 1 <html lang="en"> 2 <head> 3 <meta charset="UTF-8"> 4 <title>Document</title> 5 <style> 6 .box{ 7 /*相对于浏览器的宽度*

学习制作手机页面2

学习制作手机页面2. 先介绍一个css3的属性.box-sizing 这个属性 就是把盒模型的border 和padding 都计算在内 未使用box-sizing的代码 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>box-sizing</title> 6 7 <style&

第一节:XML学习

第一节:XML学习 XML是什么 XML是可拓展标记语言,类似于HTML. 但它的设计宗旨是出传输数据而不是显示数据,也就是说HTML设计宗旨是为了显示数据. XML标签没有被预定于,需要自行定义标签.有自我描述性. XML应用场景 用于存储一对多的数据 用于当作配置文件存储数据 XML与HTML的差异 XML与HTML设计目的不同,HTML主要应用于显示数据比如网页开发等,XML用于传输和存储数据. HTML用于显示信息,XML用于传输信息 XML是对HTML的补充 为什么用XML 为了便于不

分享免费的.net开发框架学习资料(专题汇总)

分享免费.net学习资料,.net平台开发,全部免费!!! 专题:水晶报表使用入门及实战http://edu.ibeifeng.com/view-index-id-357.html 专题:源代码管理工具的使用与配置http://edu.ibeifeng.com/view-index-id-349.html 专题:大型网站性能优化http://edu.ibeifeng.com/view-index-id-347.html 专题:JavaScript压缩.调试及性能调优http://edu.ibei