在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”的十大最常用字词?的主要内容,如果未能解决你的问题,请参考以下文章

centos安装配置hadoop超详细过程(含故障排除)

猪错误:未处理的内部错误。找到了接口 org.apache.hadoop.mapreduce.TaskAttemptContext,但是需要类

PIG - 找到接口 org.apache.hadoop.mapreduce.JobContext,但预期类

Hadoop学习之Mapreduce安装

Pig Elephant-Bird 找到接口 org.apache.hadoop.mapreduce.JobContext,但是应该有类

为啥这个 sqoop 命令会抛出异常?无法找到或加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster