Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)

大致思路是将hdfs上的文本作为输入,MapReduce通过InputFormat会将文本进行切片处理,并将每行的首字母相对于文本文件的首地址的偏移量作为输入键值对的key,文本内容作为输入键值对的value,经过在map函数处理,输出中间结果<word,1>的形式,并在reduce函数中完成对每个单词的词频统计。整个程序代码主要包括两部分:Mapper部分和Reducer部分。

Mapper代码

    public  static  class  doMapper  extends  Mapper<Object,  Text,  Text,  IntWritable>{
//第一个Object表示输入key的类型;第二个Text表示输入value的类型;第三个Text表示表示输出键的类型;第四个IntWritable表示输出值的类型  
        public  static  final  IntWritable  one  =  new  IntWritable(1);
        public  static  Text  word  =  new  Text();
        @Override
        protected  void  map(Object  key,  Text  value,  Context  context)
                    throws  IOException,  InterruptedException
 //抛出异常  {
            StringTokenizer  tokenizer  =  new  StringTokenizer(value.toString(),  " ");
//StringTokenizer是Java工具包中的一个类,用于将字符串进行拆分
            while(tokenizer.hasMoreTokens()) //循环每一行拆分出的所有单词
           {
                 word.set(tokenizer.nextToken()); //返回当前位置到下一个分隔符之间的字符串
                  context.write(word,  one);  //将word存到容器中,记一个数  
            }

        }
    }  

在map函数里有三个参数,前面两个Object key,Text value就是输入的key和value,第三个参数Context context是可以记录输入的key和value。例如context.write(word,one);此外context还会记录map运算的状态。map阶段采用Hadoop的默认的作业输入方式,把输入的value用StringTokenizer()方法截取出的单词设置为key,设置value为1,然后直接输出<key,value>。

Reducer代码

    public  static  class  doReducer  extends  Reducer<Text,  IntWritable,  Text,  IntWritable>{
//参数同Map一样,依次表示是输入键类型,输入值类型,输出键类型,输出值类型
        private  IntWritable  result  =  new  IntWritable();
        @Override
        protected  void  reduce(Text  key,  Iterable<IntWritable>  values,  Context  context)
        throws  IOException,  InterruptedException  {
        int  sum  =  0;
        for  (IntWritable  value  :  values)  {
        sum  +=  value.get();
        }
//for循环遍历,将得到的values值累加  
        result.set(sum);
        System.out.println(sum);
        context.write(key,  result);
        }
    } 

map输出的<key,value>先要经过shuffle过程把相同key值的所有value聚集起来形成<key,values>后交给reduce端。reduce端接收到<key,values>之后,将输入的key直接复制给输出的key,用for循环遍历values并求和,求和结果就是key值代表的单词出现的总次,将其设置为value,直接输出<key,value>。

完整代码:

import  java.io.IOException;
import  java.util.StringTokenizer;
import  org.apache.hadoop.fs.Path;
import  org.apache.hadoop.io.IntWritable;
import  org.apache.hadoop.io.Text;
import  org.apache.hadoop.mapreduce.Job;
import  org.apache.hadoop.mapreduce.Mapper;
import  org.apache.hadoop.mapreduce.Reducer;
import  org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import  org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public  class  WordCount  {
    public  static  void  main(String[]  args)  throws  IOException,  ClassNotFoundException,  InterruptedException  {
        Job  job  =  Job.getInstance();
        job.setJobName("WordCount");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(doMapper.class);
        job.setReducerClass(doReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        Path  in  =  new  Path("hdfs://192.168.68.130:9000/user/hadoop/wordcount.txt"); //需要统计的文本所在位置
        Path  out  = new Path("hdfs://192.168.68.130:9000/user/hadoop/output3");  //注意output3不能存在
        FileInputFormat.addInputPath(job,  in);
        FileOutputFormat.setOutputPath(job,  out);
        System.exit(job.waitForCompletion(true) ? 0  :  1);
    }
    public  static  class  doMapper  extends  Mapper<Object,  Text,  Text,  IntWritable>{
        public  static  final  IntWritable  one  =  new  IntWritable(1);
        public  static  Text  word  =  new  Text();
        @Override
        protected  void  map(Object  key,  Text  value,  Context  context)
                    throws  IOException,  InterruptedException  {
            StringTokenizer  tokenizer  =  new  StringTokenizer(value.toString(),  " ");
            while(tokenizer.hasMoreTokens()) {
                 word.set(tokenizer.nextToken());
                  context.write(word,  one);
            }

        }
    }
    public  static  class  doReducer  extends  Reducer<Text,  IntWritable,  Text,  IntWritable>{
        private  IntWritable  result  =  new  IntWritable();
        @Override
        protected  void  reduce(Text  key,  Iterable<IntWritable>  values,  Context  context)
        throws  IOException,  InterruptedException  {
        int  sum  =  0;
        for  (IntWritable  value  :  values)  {
        sum  +=  value.get();
        }
        result.set(sum);
        System.out.println(sum);
        context.write(key,  result);
        }
    }
}  

原文地址:https://www.cnblogs.com/sakura--/p/11448874.html

时间: 2024-10-18 00:22:38

Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)的相关文章

hive学习之WordCount单词统计

看hive目录下就可以了,程序在hdfs里创建一个hive的大文件夹,相当于数据库吧.上面就是一个完整的利用hive来做单词统计,其中的优劣也能看出一点.

Eclipse上运行第一个Hadoop实例 - WordCount(单词统计程序)

需求 计算出文件中每个单词的频数.要求输出结果按照单词的字母顺序进行排序.每个单词和其频数占一行,单词和频数之间有间隔. 比如,输入一个文件,其内容如下: hello world hello hadoop hello mapreduce 对应上面给出的输入样例,其输出样例为: hadoop 1 hello 3 mapreduce 1 world 1 方案制定 对该案例,可设计出如下的MapReduce方案: 1. Map阶段各节点完成由输入数据到单词切分的工作 2. shuffle阶段完成相同单

运行Hadoop自带的wordcount单词统计程序

0.前言 前面一篇<Hadoop初体验:快速搭建Hadoop伪分布式环境>搭建了一个Hadoop的环境,现在就使用Hadoop自带的wordcount程序来做单词统计的案例. 1.使用示例程序实现单词统计 (1)wordcount程序 wordcount程序在hadoop的share目录下,如下: [[email protected] mapreduce]# pwd /usr/local/hadoop/share/hadoop/mapreduce [[email protected] mapr

第六篇:Eclipse上运行第一个Hadoop实例 - WordCount(单词统计程序)

需求 计算出文件中每个单词的频数.要求输出结果按照单词的字母顺序进行排序.每个单词和其频数占一行,单词和频数之间有间隔. 比如,输入两个文件,其一内容如下: hello world hello hadoop hello mapreduce 另一内容如下: bye world bye hadoop bye mapreduce 对应上面给出的输入样例,其输出样例为: bye   3 hadoop 2 hello 3 mapreduce 2 world 2 方案制定 对该案例,可设计出如下的MapRe

python实例:利用jieba库,分析统计金庸名著《倚天屠龙记》中人物名出现次数并排序

本实例主要用到python的jieba库 首先当然是安装pip install jieba 这里比较关键的是如下几个步骤: 加载文本,分析文本 txt=open("C:\\Users\\Beckham\\Desktop\\python\\倚天屠龙记.txt","r", encoding='utf-8').read() #打开倚天屠龙记文本 words=jieba.lcut(txt) #jieba库分析文本 对数据进行筛选和处理 for word in words:

2018-08-05 期 MapReduce实现每个单词在每个文件中坐标信息统计

package cn.sjq.bigdata.inverted.index; import java.io.IOException; import java.util.Iterator; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; i

大数据阶段划分及案例单词统计

大数据阶段的重要课程划分 离线分析 : hadoop生态圈 HDFS, MapReduce(概念偏多), hive(底层是MapReduce), 离线业务分析80%都是使用hive 实时分析 : spark 数据结构 : 二叉树(面试) 动态规划, redis数据库, SSM三大框架 1. spring 2. springMVC 3. mybatis HDFSAPI HDFS创建目录 @Test public void mkdirTest() throws IOException { //1 获

Exercise: Maps (单词统计)

A Tour of Go Exercise: Maps https://tour.golang.org/moretypes/23 WordCount (单词统计) 是一个很经典的小程序了,在很多编程入门教程中都会出现. 这道题比较简单,但也有一些知识点值得一提. 上面这个答案我是参考了网上别人写的.但在参考别人之前我也自己解题了,其中,唯一不同之处是这一句: m[word]++ 我本来写的是: _, ok := m[word] if ok { m[word]++ } else { m[word]

Hadoop实战5:MapReduce编程-WordCount统计单词个数-eclipse-java-windows环境

Hadoop研发在java环境的拓展 一 背景 由于一直使用hadoop streaming形式编写mapreduce程序,所以目前的hadoop程序局限于python语言.下面为了拓展java语言研发,本次实验使用window系统,maven打包,centos系统mapr环境运行. 二 步骤 1 查看hadoop版本,命令 Hadoop version,获得版本号hadoop2.7.0 2 编写pow文件,注意hadoop2.7依赖, <dependency> <groupId>