wcin_file的内容:
Run 1
access 1
default 2
out 2
project 1
task 1
windows 1
your 1
我想使用MapReduce在第二个fild的文件 wcin_file 中对这些数据进行排序,如下所示:
default 2
out 2
access 1
...
但我发现输出文件只包含两行:
default 2
Run 1
为什么呢?以下是一些源代码:
SortLogsMapper
public static class SortLogsMapper extends
Mapper<Object, Text, Text, IntWritable> {
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
context.write(value, new IntWritable(0)); //the content of value is just every line, just as `Run 1`, `access 1` etc.
}
}
SortLogsReducer
public static class SortLogsReducer extends
Reducer<Text, IntWritable, Text, IntWritable> {
private Text k = new Text();
private IntWritable v = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
k.set(key.toString().split(" ")[0]); //split to get the first filed
v.set(Integer.parseInt(key.toString().split(" ")[1])); //second filed
context.write(k, v);
}
}
LogDescComparator
public static class LogDescComparator extends WritableComparator {
protected LogDescComparator() {
super(Text.class, true);
}
@Override
public int compare(WritableComparable w1, WritableComparable w2) {
Text t1 = (Text) w1;
Text t2 = (Text) w2;
String[] t1Items = t1.toString().split("\t| ");
String[] t2Items = t2.toString().split("\t| ");
Integer t1Value = Integer.parseInt(t1Items[1]);
Integer t2Value = Integer.parseInt(t2Items[1]);
int comp = t2Value.compareTo(t1Value);
return comp;
然后我在主要功能中开始了这项工作:
Job job2 = new Job(conf2, "sort");
job2.setNumReduceTasks(1);
job2.setJarByClass(WordCount.class);
job2.setMapperClass(SortLogsMapper.class);
job2.setReducerClass(SortLogsReducer.class);
job2.setSortComparatorClass(LogDescComparator.class);
job2.setOutputKeyClass(Text.class);
job2.setOutputValueClass(IntWritable.class);
FileInputFormat.setInputPaths(job2, new Path("wcin_file"));
FileOutputFormat.setOutputPath(job2, new Path("wcout"));
System.exit(job2.waitForCompletion(true) ? 0 : 1);
答案 0 :(得分:0)
现在,您的Mapper正在输出以下键值对:
(“Key'some number'”,0)
尝试让映射器拆分值并输出:
(键,'某些数字')
重新编写比较器,先根据键,然后从mapper输出中进行比较(可能已有预先定义的比较器)。
然后你的reducer应该收到密钥和值列表。迭代这个值列表:
(关键,价值)
你做的最多,如果不是所有的减速机工作。尝试使用我在此处描述的映射器。
答案 1 :(得分:0)
在 LogDescComparator 文件中,似乎如果变量 comp 等于0,则不会打印该值。当comp等于0时,添加一些代码来处理这种情况。