MapReduce算法形式一:WordCount

这种形式可以做一些网站登陆次数,或者某个电商网站的商品销量啊诸如此类的,主要就是求和,但是求和之前还是要好好清洗数据的,以免数据缺省值太多,影响真实性。

废话不多说,上代码吧,我把注释一行行的都写了~~可可可可~

先封装了数据行的对象:

public class Log {
  private String time;
  private String UID;
  private String keyWord;
  private int rank;
  private int order;
  private String URL;

  public String getTime() {
    return time;
  }
  public void setTime(String time) {
    this.time = time;
  }
  public String getUID() {
    return UID;
  }
  public void setUID(String uID) {
    UID = uID;
  }
  public String getKeyWord() {
    return keyWord;
  }
  public void setKeyWord(String keyWord) {
    this.keyWord = keyWord;
  }
  public int getRank() {
    return rank;
  }
  public void setRank(int rank) {
    this.rank = rank;
  }
  public int getOrder() {
    return order;
  }
  public void setOrder(int order) {
    this.order = order;
  }
  public String getURL() {
    return URL;
  }
  public void setURL(String uRL) {
    URL = uRL;
  }

  public Log(String time, String uID, String keyWord, int rank, int order,String uRL) {
    super();
    this.time = time;
    this.UID = uID;
    this.keyWord = keyWord;
    this.rank = rank;
    this.order = order;
    this.URL = uRL;
  }

  public Log() {
    super();
  }

/*
* 对行记录日志信息进行封装成对象
* 并将对象返回
*/
  public static Log getInfo(String value){
    Log log = new Log();

    //将一条日志记录转换成一个数组
    String[] lines = value.toString().trim().split("\t");
    //判断行记录中间是否有缺省值
    if(lines.length == 6){
      //行记录封装
      log.setTime(lines[0].trim());
      log.setUID(lines[1].trim());
      log.setKeyWord(lines[2].trim());
      log.setRank(Integer.parseInt(lines[3].trim()));
      log.setOrder(Integer.parseInt(lines[4].trim()));
      log.setURL(lines[5].trim());
    }
      return log;
  }

}

mr中的代码:

public class PVSum {
/**案例一:WordCount
*
* 非空查询条数
* 不去重,直接统计总和即可
*
* 假设:
* 日志格式如下:(已经过清洗,以制表符分割)
* 20111230050630 时间time
* 2a12e06f50ad41063ed2b62bffac29ad 用户UID
* 361泰国电影 搜索的关键词keyword
* 5 rank搜索结果排序
* 8 order点击次数
* http://www.57ge.com/play/?play_2371_1_361.html 访问的URL
*
* @param args
* @throws Exception
*/
public static void main(String[] path) throws Exception {
  if(path.length != 2){
    System.out.println("please input full path!");
    System.exit(0);
  }

  Job job = Job.getInstance(new Configuration(), PVSum.class.getSimpleName());
  job.setJarByClass(PVSum.class);

  FileInputFormat.setInputPaths(job, new Path(path[0]));
  FileOutputFormat.setOutputPath(job, new Path(path[1]));

  job.setMapperClass(PVSumMap.class);
  job.setReducerClass(PVSumReduce.class);

  job.setOutputKeyClass(Text.class);
  job.setOutputValueClass(IntWritable.class);

  job.waitForCompletion(true);
}

public static class PVSumMap extends Mapper<LongWritable, Text, Text, IntWritable> {
  IntWritable one = new IntWritable(1);//记录数量,一条记录即为1
  Text text = new Text("非空关键词的PV访问量总计:");
  protected void map(LongWritable key, Text value,org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, IntWritable>.Context context)
            throws java.io.IOException, InterruptedException {
    //获取每条记录的对象
    Log log = Log.getInfo(value.toString().trim());
    //判断关键字是否为空
    if(log.getKeyWord().trim() != null && !log.getKeyWord().trim().equals("")){
      //写入数据
      context.write(text, one);
      //map : <非空关键词的PV访问量总计:, 1>
    }
  };
}

//shuffle : <非空关键词的PV访问量总计:, {1, 1, 1...}>

public static class PVSumReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
  protected void reduce(Text key, java.lang.Iterable<IntWritable> values,

              org.apache.hadoop.mapreduce.Reducer<Text, IntWritable, Text, IntWritable>.Context context)

              throws java.io.IOException, InterruptedException {
      int sum = 0;//记录总条数
      for (IntWritable count : values) {
        sum += count.get();
      }
      context.write(key, new IntWritable(sum));
  };
}

}

MapReduce算法形式一:WordCount的更多相关文章

  1. MapReduce算法形式六:只有Map独自作战

    案例六:Map独自直接输出 之前一直没有用过这个map独自输出的模式,就算是输出一些简单的我也会经过一次reduce输出,但是,发现这个map输出的结果跟我预想的有点不一样,我一直以为shuffle的 ...

  2. MapReduce算法形式五:TOP—N

    案例五:TOP—N 这个问题比较常见,一般都用于求前几个或者后几个的问题,shuffle有一个默认的排序是正序的,但如果需要逆序的并且暂时还不知道如何重写shuffle的排序规则的时候就用以下方法就行 ...

  3. MapReduce算法形式四:mapjoin

    案例四:mapjoin(对个map共同输入,一个reduce) 这个方法主要解决的是,几个表之间的比较,类似于数据库的内外连接,还有一些左右连接之类的,简而言之就是,A表没有的B表有,B表有的A没有或 ...

  4. MapReduce算法形式三:cleanup

    案例三:cleanup 其实这个案例可以不用写这么复杂,不用cleanup也能写,但是为了,突显,突显,突显(重要的事说四遍)cleanup的重要性,琢磨了半天,恩,这样写既可以突显cleanup又显 ...

  5. MapReduce算法形式二:去重(HashSet)

    案例二:去重(shuffle/HashSet等方法)shuffle主要针对的是key去重HashSet主要针对values去重

  6. MapReduce算法形式二:去重(shuffle)

    案例二:去重(shuffle/HashSet等方法)shuffle主要针对的是key去重HashSet主要针对values去重

  7. hadoop笔记之MapReduce的应用案例(WordCount单词计数)

    MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...

  8. 海量数据挖掘MMDS week6: MapReduce算法(进阶)

    http://blog.csdn.net/pipisorry/article/details/49445519 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  9. 如何简单解释 MapReduce算法

    原文地址:如何简单解释 MapReduce 算法 在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapReduce算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的. 例子 ...

随机推荐

  1. hdu 3711

    #include<stdio.h> #include<math.h> #include<stdlib.h> int cmp(const void *a,const ...

  2. MyEclipse6.5增加对Tomcat7的支持

    MyEclipse6.5增加对Tomcat7的支持 最近在研究Servlet3.0,它是JavaEE6.0规范中的一部分 而Servlet3.0对服务器是有要求的,比如Tomcat7+(而Tomcat ...

  3. 【Git】Git 本地的撤销修改和删除操作

    一:撤销操作 比如我现在在readme.txt文件里面增加一行 内容为555555555555,我们先通过命令查看如下: 在我未提交之前,我发现添加5555555555555内容有误,所以我得马上恢复 ...

  4. Laravel 之Cache缓存

    写入缓存 Cache::put('key','value',10);//设置10分钟 获取缓存 Cache::get('key'); 增加缓存 Cache::add('key','value',10) ...

  5. vue之列表渲染

    一.v-for循环用于数组 v-for 指令根据一组数组的选项列表进行渲染. 1.v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组名, item 是数组元 ...

  6. codevs——1501 二叉树最大宽度和高度

    1501 二叉树最大宽度和高度  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 给出一个二叉树,输出它的 ...

  7. avi视频文件提取与合并

    最近在做一个avi视频文件的提取与合并,花了几天熟悉avi文件格式.制作了一个提取与合并的动态库,不过仅限于提取视频,视频的合并还没添加一些额外判断,可能导致不同分辨率的视频文件合成后不能播放.欢迎大 ...

  8. mysql中进行删除操作时用到not in 导致删除不成功

    delete from tb_news where id not in ( select max(id) From tb_news Group By title ) 刚开始用这条语句删除一直不成功 然 ...

  9. BS版代码生成器 简介

    自用的代码生成器 核心:JdbcTemplate+freemarker 目前支持sqlserver和mysql 演示: 1.首界面 2.读数据库中的所有表 3.打开某数据库下的所有表.视图.存储过程 ...

  10. NSTimer与NSRunLoop的关系分析

    NSTimer与NSRunLoop的关系分析 发表于 2013 年 6 月 27 日 由 bluev | 6 次浏览 最近关于NSTimer和NSRunLoop的关系,做了一个小试验.代码地址:htt ...