Ответ 1
Похоже, что ваш метод compareTo
нарушает общий , для которого sgn(x.compareTo(y))
требуется -sgn(y.compareTo(x))
.
Я работаю над проектом 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;
}
Похоже, что ваш метод compareTo
нарушает общий , для которого sgn(x.compareTo(y))
требуется -sgn(y.compareTo(x))
.
После вашего 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 процедуры: Разметка, Сортировка и группировка. Я предполагаю, что у вас есть несколько редукторов, и ваши аналогичные результаты были обработаны разными редукторами, поскольку они находятся в разных разделах.
Вы можете установить количество редукторов на 1 или установить пользовательский Partitioner, который расширяет org.apache.hadoop.mapreduce.Partitioner для вашей работы.