hadoop mapreduce单词词频统计
时间: 2023-08-23 12:05:43 浏览: 145
大数据 hadoop mapreduce 词频统计
Hadoop MapReduce单词词频统计可以通过以下步骤实现:
1.编写Mapper类
Mapper类是MapReduce程序的核心组件之一,负责将输入数据划分为多个键值对,其中键表示输入记录的任意标识符,值表示输入记录的内容。对于单词词频统计程序,我们需要在Mapper中将每个单词作为键,将出现次数作为值输出。以下是一个简单的Mapper类实现:
```java
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
```
在上面的代码中,我们使用Java的StringTokenizer工具类将每行输入数据拆分为单个单词,并将它们作为键输出,出现次数作为值输出。其中,Mapper的输入键值对类型为LongWritable和Text,输出键值对类型为Text和IntWritable。
2.编写Reducer类
Reducer类是MapReduce程序的另一个核心组件,负责将Mapper输出的键值对进行归约,以便生成最终的输出结果。对于单词词频统计程序,我们需要在Reducer中计算每个单词在输入数据中出现的总次数,并将其作为输出结果。以下是一个简单的Reducer类实现:
```java
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
}
```
在上面的代码中,我们将Reducer的输入键值对类型设置为Text和IntWritable,输出键值对类型也为Text和IntWritable。Reducer接收到的每个键值对都包含一个单词和它在输入数据中出现的次数列表。我们可以遍历这个列表并计算出总次数,然后将其作为值输出。
3.编写Driver类
Driver类是MapReduce程序的控制器,负责设置和启动MapReduce作业的各个组件。以下是一个简单的Driver类实现:
```java
public class WordCountDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCountDriver.class);
job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);
job.setReducerClass(WordCountReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
在上面的代码中,我们首先创建一个Configuration对象,并使用它来创建一个Job对象。我们通过setJarByClass()方法指定程序的入口点,并使用setMapperClass()、setCombinerClass()和setReducerClass()方法设置Mapper、Combiner和Reducer类。我们还使用setOutputKeyClass()和setOutputValueClass()方法指定Mapper和Reducer的输出键值对类型。最后,我们使用FileInputFormat.addInputPath()和FileOutputFormat.setOutputPath()方法设置输入和输出路径,并调用job.waitForCompletion()方法提交作业并等待其完成。
4.运行程序
最后,我们可以使用hadoop jar命令来运行MapReduce程序,并将输入数据和输出路径作为命令行参数传递:
```
hadoop jar WordCount.jar WordCountDriver input output
```
其中,WordCount.jar是打包后的程序文件,WordCountDriver是程序的入口点类,input是输入数据的路径,output是输出结果的路径。运行程序后,我们可以在指定的输出路径中看到生成的结果文件。
阅读全文