Вторичная сортировка в Hadoop

Я работаю над проектом hadoop и после многих посещений различных блогов и чтения документации, я понял, что мне нужно использовать функцию вторичной сортировки, предоставляемую инфраструктурой hadoop.

Мой формат ввода имеет вид:

DESC(String) Price(Integer) and some other Text

Я хочу, чтобы значения в редукторе были в порядке убывания цены. Кроме того, при сравнении DESC у меня есть метод, который принимает две строки и Процент, и если сходство между двумя строками равно или больше, чем процент, тогда я должен считать их равными.

Проблема заключается в том, что после завершения работы по сокращению я вижу несколько DESC, которые похожи на другую строку, но все же они находятся в разных группах.

Вот мой метод compareTo для составного ключа

public int compareTo(VendorKey o) {
    int result =-
    result = compare(token, o.token, ":") >= percentage ? 0:1;
    if (result == 0) {
        return pid> o.pid  ?-1: pid < o.pid ?1:0;
    }
    return result;
}

и сравнить метод группирования компаратора

public int compare(WritableComparable a, WritableComparable b) {
    VendorKey one = (VendorKey) a;
    VendorKey two = (VendorKey) b;
    int result = ClusterUtil.compare(one.getToken(), two.getToken(), ":") >= one.getPercentage() ? 0 : 1;
    // if (result != 0)
    // return two.getToken().compareTo(one.getToken());
    return result;
}

Ответ 1

Похоже, что ваш метод compareTo нарушает общий , для которого sgn(x.compareTo(y)) требуется -sgn(y.compareTo(x)).

Ответ 2

После вашего customWritable дайте один базовый разделитель с составным ключом и значением NullWritable. Например:

public class SecondarySortBasicPartitioner extends
    Partitioner<CompositeKeyWritable, NullWritable> {

    public int getPartition(CompositeKeyWritable key, NullWritable value,
            int numReduceTasks) {

        return (key.DEPT().hashCode() % numReduceTasks);
    }
}

И после этого укажите компаратор сортировки ключей и с 2 составными переменными KeyWritable. Группировка будет выполнена.

Ответ 3

Во время тасования существует 3 процедуры: Разметка, Сортировка и группировка. Я предполагаю, что у вас есть несколько редукторов, и ваши аналогичные результаты были обработаны разными редукторами, поскольку они находятся в разных разделах.

Вы можете установить количество редукторов на 1 или установить пользовательский Partitioner, который расширяет org.apache.hadoop.mapreduce.Partitioner для вашей работы.