WordCount的例子,每个文件计数



我在获取每个文件的单词出现总数的细分时遇到了一个问题。例如,我有四个文本文件(t1, t2, t3, t4)。Word w1在文件t2中出现两次,在文件t4中出现一次,总共出现三次。我想在输出文件中写入相同的信息。我正在获取每个文件中的总字数,但无法得到我想要的结果。

这是我的map类。

import java.io.IOException;
import java.util.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
//line added
import org.apache.hadoop.mapreduce.lib.input.*;
public class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
private String pattern= "^[a-z][a-z0-9]*$";
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    //line added
    InputSplit inputSplit = context.getInputSplit();
    String fileName = ((FileSplit) inputSplit).getPath().getName();
    while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        String stringWord = word.toString().toLowerCase();
        if ((stringWord).matches(pattern)){
            //context.write(new Text(stringWord), one);
            context.write(new Text(stringWord), one);
            context.write(new Text(fileName), one);
            //System.out.println(fileName);
            }
        }
    }
}

这可以通过将word写成key而将filename写成value来实现。现在在您的reducer中为每个文件初始化单独的计数器并更新它们。一旦针对特定键迭代了所有值,然后将每个文件的计数器写入上下文中。

这里您知道您只有四个文件,因此您可以硬编码四个变量。请记住,您需要为您在reducer中处理的每个新键重置变量。

如果文件数量较多,则可以使用Map。在地图中,filename将成为key,并不断更新value

在映射器的输出中,我们可以将文本文件名设置为键,并将文件中的每一行设置为值。这个减速器为您提供文件名、单词和相应的计数。

public class Reduce extends Reducer<Text, Text, Text, Text> {
    HashMap<String, Integer>input = new HashMap<String, Integer>();
    public void reduce(Text key, Iterable<Text> values , Context context)
    throws IOException, InterruptedException {
        int sum = 0;
        for(Text val: values){
            String word = val.toString(); -- processing each row
            String[] wordarray = word.split(' '); -- assuming the delimiter is a space
            for(int i=0 ; i<wordarray.length; i++)
           {
            if(input.get(wordarray[i]) == null){
            input.put(wordarray[i],1);}
            else{
             int value =input.get(wordarray[i]) +1 ; 
             input.put(wordarray[i],value);
             }
           }     
       context.write(new Text(key), new Text(input.toString()));
    }

相关内容

  • 没有找到相关文章

最新更新