Java 查找除“;”“;am”“;是”;,和“;是”;在Hadoop MapReduce中?

Java 查找除“;”“;am”“;是”;,和“;是”;在Hadoop MapReduce中?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我正在用MapReduce解决WordsCount问题。我使用了Lewis Carroll的著名电影《透过镜子》的txt文件。这是一个相当大的文件。我运行了我的MapReduce代码,它运行得很好。现在我需要找出除“the”、“am”、“is”和“are”之外最常见的前10个单词。我不知道如何处理这个问题 这是我的密码 public class WordCount { public static class TokenizerMapper extends Mapper<O

我正在用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);
}
}
公共类字数{
公共静态类令牌映射器
扩展映射器{
私有最终静态IntWritable one=新的IntWritable(1);
私有文本字=新文本();
公共无效映射(对象键、文本值、上下文
)抛出IOException、InterruptedException{
StringTokenizer itr=新的StringTokenizer(value.toString().replaceAll(“[^a-zA-Z0-9]”),trim().toLowerCase());
而(itr.hasMoreTokens()){
set(itr.nextToken());
上下文。写(单词,一);
}
}
}
公共静态类IntSumReducer
伸缩减速机{
私有IntWritable结果=新的IntWritable();
public void reduce(文本键、Iterable值、,
语境
)抛出IOException、InterruptedException{
整数和=0;
for(可写入值:值){
sum+=val.get();
}
结果集(总和);
write(key,newintwriteable(sum));
}
}
公共静态void main(字符串[]args)引发异常{
Configuration conf=新配置();
Job Job=Job.getInstance(conf,“字数”);
job.setJarByClass(WordCount.class);
setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);
/*job.setSortComparatorClass(Text.Comparator.class)*/
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
addInputPath(作业,新路径(args[0]);
setOutputPath(作业,新路径(args[1]);
系统退出(作业等待完成(真)?0:1;
}
}
我个人不打算写代码,除非我看到你这方面的尝试需要比字数更多的努力

您需要第二个映射器和减速器来执行Top N操作。如果你使用一种更高级的语言,比如Pig、Hive、Spark等,它就会这样做

对于初学者,您至少可以从
itr.nextToken()
中过滤掉单词,以防止第一个映射者看到它们

然后,在reducer中,您的输出将被取消排序,但您已经将所有单词的总和获取到某个输出目录中,这是获取顶部单词的必要的第一步

该问题的解决方案要求您创建一个新的作业对象来读取第一个输出目录,写入一个新的输出目录,并为映射器中的每一行文本生成
null,line
作为输出(使用NullWritable和text)

这样,在reducer中,所有文本行都将被发送到一个reducer迭代器中,因此为了获得前N个项目,您可以创建一个
TreeMap
,以按计数对单词进行排序(请参阅)。插入元素时,较大的值将自动推送到树的顶部。您还可以通过跟踪树中最小的元素并仅插入大于该元素的项目和/或跟踪树大小并仅插入大于第N个项目的项目(如果您可能有成百上千个单词,这会有所帮助)来对此进行优化


在将所有元素添加到树中的循环之后,获取字符串值的所有前N个值及其计数(树已经为您排序),并从减速器中写出它们。这样,您应该会得到前N项。

这与此处的解决方案类似,您在此处找不到任何内容?