无法设置密钥比较器功能



我正在尝试按值对数据进行排序

我使用的方法是将键和值组合成一个组合键

例如(键,值( -> ({键,值},值(

并定义我的键比较器,即比较键中的值部分

我的数据是我应该计算单词的段落

我做了两项工作,第一项是单词计数,但将键组合到reducer中的复合键。

这是结果

是,4 4
的,15 15
非洲经委会,1 1
到,6 6
.....

在第二个工作中,我尝试使用复合键按值排序

这是我的映射器2

public static class Map2 extends MapReduceBase
    implements Mapper<LongWritable,Text,Text,IntWritable>{
            private Text word = new Text();
            public void map(LongWritable key, Text value, OutputCollector<Text,IntWritable> output, Reporter reporter) throws IOException {
                    String line = value.toString();
                    String w1[] = line.split("t");
                    word.set(w1[0]);
                    output.collect(word,new IntWritable(Integer.valueOf(w1[1])));
            }
    }

这是我的密钥比较器

public static final class KeyComparator extends WritableComparator {
    public KeyComparator(){
            super(Text.class,true);
    }
@Override
public int compare(WritableComparable tp1, WritableComparable tp2) {
    Text t1 = (Text)tp1;
    Text t2 = (Text)tp2;
    String a[] = t1.toString().split(",");
    String b[] = t2.toString().split(",");
    return a[1].compareTo(b[1]);

}

这是我的减速器2

public static class Reduce2 extends MapReduceBase
    implements Reducer<Text, IntWritable, Text, IntWritable> {
            public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException{
                    int sum=0;
            while( values.hasNext()){
                    sum+= values.next().get();
            }
            //String cpKey[] = key.toString().split(",");
            Text outputKey = new Text();
            //outputKey.set(cpKey[0]);
            output.collect(key, new IntWritable(sum));
            }
    }

这是我的主要功能

 public static void main(String[] args) throws Exception {
            int reduceTasks = 1;
            int mapTasks = 3;
            System.out.println("1. New JobConf...");
            JobConf conf = new JobConf(WordCountV2.class);
            conf.setJobName("WordCount");
            System.out.println("2. Setting output key and value...");
            conf.setOutputKeyClass(Text.class);
            conf.setOutputValueClass(IntWritable.class);
            System.out.println("3. Setting Mapper and Reducer classes...");
            conf.setMapperClass(Map.class);
            conf.setReducerClass(Reduce.class);
            // set numbers of reducers
            System.out.println("4. Setting number of reduce and map tasks...");
            conf.setNumReduceTasks(reduceTasks);
            conf.setNumMapTasks(mapTasks);
            System.out.println("5. Setting input and output formats...");
            conf.setInputFormat(TextInputFormat.class);
            conf.setOutputFormat(TextOutputFormat.class);

            System.out.println("6. Setting input and output paths...");
            FileInputFormat.setInputPaths(conf, new Path(args[0]));
            String TempDir = "temp" + Integer.toString(new Random().nextInt(1000)+1);
            FileOutputFormat.setOutputPath(conf, new Path(TempDir));
            //FileOutputFormat.setOutputPath(conf,new Path(args[1]));
            System.out.println("7. Running job...");
            JobClient.runJob(conf);
            JobConf sort = new JobConf(WordCountV2.class);
            sort.setJobName("sort");
            sort.setMapOutputKeyClass(Text.class);
            sort.setMapOutputValueClass(IntWritable.class);
            sort.setOutputKeyComparatorClass(KeyComparator.class);
            sort.setMapperClass(Map2.class);
            sort.setReducerClass(Reduce2.class);
            sort.setNumReduceTasks(reduceTasks);
            sort.setNumMapTasks(mapTasks);
            sort.setInputFormat(TextInputFormat.class);
            sort.setOutputFormat(TextOutputFormat.class);
            FileInputFormat.setInputPaths(sort,TempDir);
            FileOutputFormat.setOutputPath(sort, new Path(args[1]));
            JobClient.runJob(sort);

    }

但结果是这样的

是 13
32
非洲经委会 21
到 14
. . .

并失去了许多字

但是如果我没有使用我的密钥比较器

它返回到未排序的结果,就像我提到的第一个一样

有什么想法可以解决问题吗?谢谢!

我不确定你在哪里犯了错误。
但是您要执行的操作称为基于值Secondary Sort排序。
这不是一项微不足道的工作,但您需要为patition,aggregation和其他东西创建更多类,这些类在这里和这里
都有明确的解释只需按照这些博客中的说明进行操作,肯定会对您有所帮助。

相关内容

  • 没有找到相关文章

最新更新