Сортировка по значению в Hadoop из файла - PullRequest
4 голосов
/ 28 ноября 2011

У меня есть файл, содержащий строку, затем пробел, а затем число в каждой строке.

Пример:

Line1: Word 2
Line2 : Word1 8
Line3: Word2 1

Мне нужно отсортировать число в порядке убывания, а затем поместить результат в файл с присвоением ранга числам. Поэтому мой вывод должен быть файл, содержащий следующий формат:

Line1: Word1 8 1
Line2: Word  2 2
Line3: Word2 1 3

У кого-нибудь есть идея, как я могу это сделать в Hadoop? Я использую Java с Hadoop.

Ответы [ 3 ]

8 голосов
/ 28 ноября 2011

Вы можете организовать свою карту / сократить вычисления следующим образом:

Ввод карты: по умолчанию

Вывод карты: "ключ: число, значение: слово"

_ этап сортировки по ключу _

Здесь вам потребуется переопределить сортировщик по умолчанию для сортировки в порядке убывания.

Уменьшить - 1 редуктор

Уменьшить ввод:«ключ: число, значение: слово»

Уменьшить вывод: «ключ: слово, значение: (число, ранг)»

Сохранить глобальный счетчик.Для каждой пары ключ-значение добавьте ранг, увеличив счетчик.

Редактировать : Вот код, отобранный для пользовательского сортировщика-потомка:

public static class IntComparator extends WritableComparator {

    public IntComparator() {
        super(IntWritable.class);
    }

    @Override
    public int compare(byte[] b1, int s1, int l1,
            byte[] b2, int s2, int l2) {

        Integer v1 = ByteBuffer.wrap(b1, s1, l1).getInt();
        Integer v2 = ByteBuffer.wrap(b2, s2, l2).getInt();

        return v1.compareTo(v2) * (-1);
    }
}

Don 'не забудьте установить его в качестве компаратора для вашей работы:

job.setSortComparatorClass(IntComparator.class);
5 голосов
/ 20 августа 2012

Потоковая передача Hadoop - Hadoop 1.0.x

Согласно это , после

bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.*.jar
  1. Вы добавляете компаратор

    -D mapred.output.key.comparator.class = org.apache.hadoop.mapred.lib.KeyFieldBasedComparator

  2. вы указываете желаемую сортировку

    -D mapred.text.key.comparator.options = - [опции]

, где [опции] похожи на Unix sort . Вот несколько примеров,

В обратном порядке

-D mapred.text.key.comparator.options=-r

Сортировка по числовым значениям

-D mapred.text.key.comparator.options=-n

Сортировка по значению или какому-либо полю

-D mapred.text.key.comparator.options=-kx,y

с флагом -k вы указываете ключ сортировки. Параметры x, y определяют этот ключ. Таким образом, если у вас есть строка с более чем одним токеном, вы можете выбрать, какой из всех токенов будет ключом сортировки или какая комбинация токенов будет ключом сортировки. См. Ссылки для более подробной информации и примеров.

2 голосов
/ 03 февраля 2012

Я придумал решение этой проблемы.На самом деле все было просто.

Для сортировки по значению вам нужно использовать

setOutputValueGroupingComparator(Class)

Для сортировки по убыванию вам нужно использовать setSortComparatorClass(LongWritable.DecreasingComparator.class);

Для ранжирования вам нужноиспользовать функции Counter class, getCounter и increment.

...