我有一个问题,以获得每一个文件中出现的单词总数的细分。例如,我有四个文本文件(t1、t2、t3、t4)。单词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);
}
}
}
}
2条答案
按热度按时间am46iovg1#
这可以通过写作来实现
word
作为key
以及filename
作为value
. 现在在您的reducer中,为每个文件初始化单独的计数器并更新它们。对特定键迭代所有值后,将每个文件的计数器写入上下文。这里您知道您只有四个文件,所以您可以硬编码四个变量。记住,您需要为在reducer中处理的每个新键重置变量。
如果文件数量较多,则可以使用map。在Map上,
filename
将key
并不断更新value
.k2arahey2#
在Map器的输出中,我们可以将文本文件名设置为键,并将文件中的每一行设置为值。这个reducer为您提供文件名、单词及其对应的计数。