在Hadoop MapReduce中找到排除“the”,“am”,“is”和“are”的十大最常用字词?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Hadoop MapReduce中找到排除“the”,“am”,“is”和“are”的十大最常用字词?相关的知识,希望对你有一定的参考价值。
我正在使用MapReduce处理WordsCount问题。我使用了Lewis Carroll着名的透过镜子的txt文件。它非常大的档案。我运行了我的MapReduce代码并且工作正常。现在我需要找出除“the”,“am”,“is”和“are”之外的前10个最常用词。我不知道如何处理这个问题。
这是我的代码
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString().replaceAll("[^a-zA-Z0-9]", " ").trim().toLowerCase());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
/* job.setSortComparatorClass(Text.Comparator.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);
}
}
我个人不会编写代码,直到我看到你的结果需要比Wordcount更多的努力。
您需要第二个映射器和reducer来执行前N个操作。如果您使用了更高级别的语言,如Pig,Hive,Spark等,那就是它的功能。
对于初学者,你至少可以过滤掉itr.nextToken()
中的单词,以防止第一个映射器看到它们。
然后,在reducer中,您的输出将是未排序的,但您已经将所有单词的总和获取到某个输出目录,这是获取顶部单词的必要的第一步。
该问题的解决方案要求您创建一个新的Job对象来读取第一个输出目录,写入新的输出目录,并且对于mapper中的每一行文本生成null, line
作为输出(使用NullWritable和Text)。
有了这个,在reducer中,所有文本行都将被发送到一个reducer迭代器中,因此为了获得前N个项,你可以创建一个TreeMap<Integer, String>
来按计数对单词进行排序(参考Sorting Descending order: Java Map)。插入元素时,较大的值将自动推送到树的顶部。您也可以选择通过跟踪树中的最小元素来优化这一点,并且只插入大于它的项目,和/或跟踪树大小,并且只插入大于第N项的项目(如果您可能有数百项,这会有所帮助成千上万的话)。
在将所有元素添加到树的循环之后,取所有字符串值的前N个及其计数(树已经为您排序),并从reducer中将它们写出来。有了这个,你应该得到前N项。
以上是关于在Hadoop MapReduce中找到排除“the”,“am”,“is”和“are”的十大最常用字词?的主要内容,如果未能解决你的问题,请参考以下文章
猪错误:未处理的内部错误。找到了接口 org.apache.hadoop.mapreduce.TaskAttemptContext,但是需要类
PIG - 找到接口 org.apache.hadoop.mapreduce.JobContext,但预期类
Pig Elephant-Bird 找到接口 org.apache.hadoop.mapreduce.JobContext,但是应该有类
为啥这个 sqoop 命令会抛出异常?无法找到或加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster