Порядок сортировки с Hadoop MapRed - PullRequest
3 голосов
/ 29 февраля 2012

Ну,

Я хотел бы знать, как я могу изменить порядок сортировки моей простой программы WordCount после задачи сокращения?Я уже сделал другую карту, чтобы упорядочить по значению, а не по ключам, но она все еще упорядочена в порядке возрастания.Есть ли простой способ сделать это (изменить порядок сортировки)?!

Спасибо Vellozo

Ответы [ 2 ]

7 голосов
/ 29 февраля 2012

Если вы используете более старый API (mapred.*), тогда установите OutputKeyComparatorClass в conf задания:

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 () .

3 голосов
/ 05 декабря 2015

Это почти то же самое, что и выше, просто выглядит немного проще

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; 

Вы можете изменить вышеуказанный тип текста в соответствии с вашим использованием.

...