当前位置:   article > 正文

MapReduce Java API实例-统计单词出现频率_词频统计api

词频统计api

场景

Windows下使用Java API操作HDFS的常用方法:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119382108

在上面使用Java API操作HDFS已经配置开发环境的基础上。

使用Java API操作Mapreduce统计单次出现的次数。

这里Hadoop集群搭建的是Hadoop2.8.0,所以新建Maven项目并引入依赖

  1.         <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
  2.         <dependency>
  3.             <groupId>org.apache.hadoop</groupId>
  4.             <artifactId>hadoop-client</artifactId>
  5.             <version>2.8.0</version>
  6.         </dependency>
  7.         <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
  8.         <dependency>
  9.             <groupId>org.apache.hadoop</groupId>
  10.             <artifactId>hadoop-common</artifactId>
  11.             <version>2.8.0</version>
  12.         </dependency>
  13.         <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs -->
  14.         <dependency>
  15.             <groupId>org.apache.hadoop</groupId>
  16.             <artifactId>hadoop-hdfs</artifactId>
  17.             <version>2.8.0</version>
  18.         </dependency>
  19.         <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-hdfs-client -->
  20.         <dependency>
  21.             <groupId>org.apache.hadoop</groupId>
  22.             <artifactId>hadoop-hdfs-client</artifactId>
  23.             <version>2.8.0</version>
  24.         </dependency>
  25.         <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-client-core -->
  26.         <dependency>
  27.             <groupId>org.apache.hadoop</groupId>
  28.             <artifactId>hadoop-mapreduce-client-core</artifactId>
  29.             <version>2.8.0</version>
  30.         </dependency>
  31.         <!-- https://mvnrepository.com/artifact/junit/junit -->
  32.         <dependency>
  33.             <groupId>junit</groupId>
  34.             <artifactId>junit</artifactId>
  35.             <version>4.12</version>
  36.             <scope>test</scope>
  37.         </dependency>

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

实现对指定目录或文件中的单词出现次数进行统计,默认输出结果是以单词字典排序。
采用默认文本读入,每行读取一次,然后使用\t对数据进行分割或者使用字符串类
StringTokenizer对其分割(该类会按照空格、\t、\n等进行切分)。在Reduce端相同的key,即
相同的单词会在一起进行求和处理,求出出现次数。

1、首先新建数据集worlds.txt

2、编写map类,通过继承Mapper类实现里面的map函数

Mapper类中的第一个参数是Object(常用),也可以写成Long

第一个参数对应的值是行偏移量

第二个参数类型通常是Text类型,Text类型是Hadoop实现的String类型的可写类型

第三个参数表示的是输出key的数据类型

第四个参数表示的是输出value的数据类型,IntWritable是Hadoop实现的int类型的可写数据类型

  1. package com.badao.mapreducedemo;
  2. import org.apache.hadoop.io.IntWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Mapper;
  5. import java.io.IOException;
  6. import java.util.StringTokenizer;
  7. public class WorldCountMapper extends Mapper<Object,Text,Text,IntWritable> {
  8.     //1、编写map函数,通过继承Mapper类实现里面的map函数
  9.     //   Mapper类当中的第一个函数是Object,也可以写成Long
  10.     //   第一个参数对应的值是行偏移量
  11.     //2、第二个参数类型通常是Text类型,Text是Hadoop实现的String 类型的可写类型
  12.     //   第二个参数对应的值是每行字符串
  13.     //3、第三个参数表示的是输出key的数据类型
  14.     //4、第四个参数表示的是输出value的数据类型,IntWriable 是Hadoop实现的int类型的可写数据类型
  15.     public final static IntWritable one = new IntWritable(1);
  16.     public Text word = new Text();
  17.     //key 是行偏移量
  18.     //value是每行字符串
  19.     @Override
  20.     public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  21.         StringTokenizer stringTokenizer = new StringTokenizer(value.toString());
  22.         while (stringTokenizer.hasMoreTokens())
  23.         {
  24.             //stringTokenizer.nextToken()是字符串类型,使用set函数完成字符串到Text数据类型的转换
  25.             word.set(stringTokenizer.nextToken());
  26.             //通过write函数写入到本地文件
  27.             context.write(word,one);
  28.         }
  29.     }
  30. }

这里有个很重要的一点就是,千万不要导错包!!!

尤其是Text

3、编写reduce类

通过继承Reduce类实现里面的reduce函数

第一个参数类型是输入值key的数据类型,map中间输出key的数据类型

第二个参数是输入值为value的数据类型,map中间输出value的数据类型

第三个参数是输出值key的数据类型,它的数据类型要跟job.setOutputKeyClass(Text.Class)保持一致

第四个参数类型是输出值value的数据类型,它的数据类型要跟job.setOutputValueClass(IntWriable.class)保持一致

  1. package com.badao.mapreducedemo;
  2. import org.apache.hadoop.io.IntWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Reducer;
  5. import java.io.IOException;
  6. //第一个参数类型是输入值key的数据类型,map中间输出key的数据类型
  7. //第二个参数类型是输入值value的数据类型,map中间输出value的数据类型
  8. //第三个参数类型是输出值key的数据类型,他的数据类型要跟job.setOutputKeyClass(Text.class) 保持一致
  9. //第四个参数类型是输出值value的数据类型,它的数据类型要跟job.setOutputValueClass(IntWriable.class) 保持一致
  10. public class WordCountReducer extends Reducer<Text, IntWritable,Text,IntWritable> {
  11.     public IntWritable result = new IntWritable();
  12.     //key就是单词  values是单词出现频率列表
  13.     @Override
  14.     public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  15.         int sum = 0;
  16.         for(IntWritable val:values)
  17.         {
  18.             //get就是取出IntWriable的值
  19.             sum += val.get();
  20.         }
  21.         result.set(sum);
  22.         context.write(key,result);
  23.     }
  24. }

4、编写job类

这里把Windows本地文件和集群HDFS抽离出两个方法

本地文件

  1.     public static void wordCountLocal()throws IOException, ClassNotFoundException, InterruptedException
  2.     {
  3.         Configuration conf = new Configuration();
  4.         //实例化一个作业,word count是作业的名字
  5.         Job job = Job.getInstance(conf, "wordcount");
  6.         //指定通过哪个类找到对应的jar包
  7.         job.setJarByClass(WorldCountJob.class);
  8.         //为job设置Mapper类
  9.         job.setMapperClass(WorldCountMapper.class);
  10.         job.setCombinerClass(IntSumReducer.class);
  11.         //为job设置reduce类
  12.         job.setReducerClass(WordCountReducer.class);
  13.         //为job的输出数据设置key
  14.         job.setOutputKeyClass(Text.class);
  15.         //为job输出设置value
  16.         job.setOutputValueClass(IntWritable.class);
  17.         //为job设置输入路径,输入路径是存在的文件夹/文件
  18.         FileInputFormat.addInputPath(job,new Path("D:\\words.txt"));
  19.         //为job设置输出路径
  20.         FileOutputFormat.setOutputPath(job,new Path("D:\\badao"));
  21.         job.waitForCompletion(true);
  22.     }

注意事项:

这里的输入路径必须存在,就是上面新建的数据集。

输出路径必须不能存在,不然会报错路径已经存在

注意这里的FileOutputFormat导入的包路径是下面的路径

然后在main方法中调用该方法

运行成功后会在D盘下badao目录下生成part-r-00000文件,这就是统计结果

集群HDFS

  1.     public static void wordCountColony()throws IOException, ClassNotFoundException, InterruptedException
  2.     {
  3.         Configuration conf = new Configuration();
  4.         conf.set("fs.defaultFS", "hdfs://192.168.148.128:9000");
  5.         System.setProperty("HADOOP_USER_NAME","root");
  6.         //实例化一个作业,word count是作业的名字
  7.         Job job = Job.getInstance(conf, "wordcount");
  8.         //指定通过哪个类找到对应的jar包
  9.         job.setJarByClass(WorldCountJob.class);
  10.         //为job设置Mapper类
  11.         job.setMapperClass(WorldCountMapper.class);
  12.         job.setCombinerClass(IntSumReducer.class);
  13.         //为job设置reduce类
  14.         job.setReducerClass(WordCountReducer.class);
  15.         //为job的输出数据设置key
  16.         job.setOutputKeyClass(Text.class);
  17.         //为job输出设置value
  18.         job.setOutputValueClass(IntWritable.class);
  19.         //为job设置输入路径,输入路径是存在的文件夹/文件
  20.         FileInputFormat.addInputPath(job,new Path("/words.txt"));
  21.         //为job设置输出路径
  22.         FileOutputFormat.setOutputPath(job,new Path("/badao9"));
  23.         job.waitForCompletion(true);
  24.     }

然后将数据集上传到集群HDFS中

然后main方法中运行该方法

运行结束后查看该文件

 job完整代码:

  1. package com.badao.mapreducedemo;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.IntWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  9. import org.apache.hadoop.mapreduce.lib.reduce.IntSumReducer;
  10. import java.io.IOException;
  11. public class WorldCountJob {
  12. public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException {
  13. wordCountLocal();
  14. }
  15. public static void wordCountLocal()throws IOException, ClassNotFoundException, InterruptedException
  16. {
  17. Configuration conf = new Configuration();
  18. //实例化一个作业,word count是作业的名字
  19. Job job = Job.getInstance(conf, "wordcount");
  20. //指定通过哪个类找到对应的jar包
  21. job.setJarByClass(WorldCountJob.class);
  22. //为job设置Mapper类
  23. job.setMapperClass(WorldCountMapper.class);
  24. job.setCombinerClass(IntSumReducer.class);
  25. //为job设置reduce类
  26. job.setReducerClass(WordCountReducer.class);
  27. //为job的输出数据设置key
  28. job.setOutputKeyClass(Text.class);
  29. //为job输出设置value
  30. job.setOutputValueClass(IntWritable.class);
  31. //为job设置输入路径,输入路径是存在的文件夹/文件
  32. FileInputFormat.addInputPath(job,new Path("D:\\words.txt"));
  33. //为job设置输出路径
  34. FileOutputFormat.setOutputPath(job,new Path("D:\\badao"));
  35. job.waitForCompletion(true);
  36. }
  37. public static void wordCountColony()throws IOException, ClassNotFoundException, InterruptedException
  38. {
  39. Configuration conf = new Configuration();
  40. conf.set("fs.defaultFS", "hdfs://192.168.148.128:9000");
  41. System.setProperty("HADOOP_USER_NAME","root");
  42. //实例化一个作业,word count是作业的名字
  43. Job job = Job.getInstance(conf, "wordcount");
  44. //指定通过哪个类找到对应的jar包
  45. job.setJarByClass(WorldCountJob.class);
  46. //为job设置Mapper类
  47. job.setMapperClass(WorldCountMapper.class);
  48. job.setCombinerClass(IntSumReducer.class);
  49. //为job设置reduce类
  50. job.setReducerClass(WordCountReducer.class);
  51. //为job的输出数据设置key
  52. job.setOutputKeyClass(Text.class);
  53. //为job输出设置value
  54. job.setOutputValueClass(IntWritable.class);
  55. //为job设置输入路径,输入路径是存在的文件夹/文件
  56. FileInputFormat.addInputPath(job,new Path("/words.txt"));
  57. //为job设置输出路径
  58. FileOutputFormat.setOutputPath(job,new Path("/badao9"));
  59. job.waitForCompletion(true);
  60. }
  61. }

示例代码下载:

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/20718869

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/337658
推荐阅读
相关标签
  

闽ICP备14008679号