私が出力しているものは次のとおりです。
単語、ファイル ----- ------ wordx Doc2、Doc1、Doc1、Doc1、Doc1、Doc1、Doc1、Doc1
私が欲しいのは:
単語、ファイル ----- ------ wordx Doc2、Doc1
public static class LineIndexMapper extends MapReduceBase
implements Mapper<LongWritable, Text, Text, Text> {
private final static Text word = new Text();
private final static Text location = new Text();
public void map(LongWritable key, Text val,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
FileSplit fileSplit = (FileSplit) reporter.getInputSplit();
String fileName = fileSplit.getPath().getName();
location.set(fileName);
String line = val.toString();
StringTokenizer itr = new StringTokenizer(line.toLowerCase());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
output.collect(word, location);
}
}
}
public static class LineIndexReducer extends MapReduceBase
implements Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterator<Text> values,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
boolean first = true;
StringBuilder toReturn = new StringBuilder();
while (values.hasNext()) {
if (!first) {
toReturn.append(", ");
}
first = false;
toReturn.append(values.next().toString());
}
output.collect(key, new Text(toReturn.toString()));
}
}
最高のパフォーマンスを得るには - 繰り返されるファイル名をどこでスキップする必要がありますか? マップ、リデュース、またはその両方?ps: 私は MR タスクの作成の初心者であり、質問でプログラミング ロジックを理解しようとしています。