2013-12-10 76 views
0

wcin_file的内容:的MapReduce:结果是不完整的

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

现在你的映射器outputing的键值对如下:

(“钥匙‘一定数量’”,0)

试图让你的映射器分裂值和输出:

(关键, '一些数字')

重先写入比较器,然后根据键先进行比较,然后再根据映射器输出的值进行比较(可能有一个预先定义的比较器)。

那么你的减速器应该接收关键和值的列表。迭代值写入这个名单:

(键,值)

你做的大多数,如果不是全部的减速的工作。按照我在这里描述的方法尝试使用您的映射器。

0

LogDescComparator文件,似乎是,如果可变排版等于0,则该值将不被打印。当comp等于0时,添加一些代码来处理这种情况。