使用Hadoop MapRed对订单进行排序

时间:2012-02-29 04:36:24

标签: sorting hadoop mapreduce

那么,

我想知道在reduce任务之后如何更改简单WordCount程序的排序顺序?我已经制作了另一张按价值而不是按键排序的地图,但它仍按升序排序。 是否有一个简单的方法来执行此操作(更改排序顺序)?!

由于 Vellozo

2 个答案:

答案 0 :(得分:7)

如果您使用的是较旧的API(mapred.*),请在作业conf中设置OutputKeyComparatorClass:

jobConf.setOutputKeyComparatorClass(ReverseComparator.class);

ReverseComparator可以是这样的:

static class ReverseComparator extends WritableComparator {
        private static final Text.Comparator TEXT_COMPARATOR = new Text.Comparator();

        public ReverseComparator() {
            super(Text.class);
        }

        @Override
        public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
            try {
                return (-1)* TEXT_COMPARATOR
                        .compare(b1, s1, l1, b2, s2, l2);
            } catch (IOException e) {
                throw new IllegalArgumentException(e);
            }
        }

        @Override
        public int compare(WritableComparable a, WritableComparable b) {
            if (a instanceof Text && b instanceof Text) {
                return (-1)*(((Text) a)
                        .compareTo((Text) b)));
            }
            return super.compare(a, b);
        }
    }

在新的API(mapreduce.*)中,我认为您需要使用Job.setSortComparator()方法。

答案 1 :(得分:3)

这个与上面几乎相同,只是看起来更简单

class MyKeyComparator extends WritableComparator {
    protected DescendingKeyComparator() {
        super(Text.class, true);
    }

    @SuppressWarnings("rawtypes")
    @Override
    public int compare(WritableComparable w1, WritableComparable w2) {
        Text key1 = (Text) w1;
        Text key2 = (Text) w2;          
        return -1 * key1.compareTo(key2);
    }
}

然后将其添加到作业

job.setSortComparatorClass(MyKeyComparator.class);

Text key1 = (Text) w1;
            Text key2 = (Text) w2; 

您可以根据自己的使用情况更改上述文字类型。