2016-08-04 6 views
11

Я работаю над проектом hadoop и после многих посещений различных блогов и чтения документации, я понял, что мне нужно использовать функцию вторичной сортировки, предоставляемую инфраструктурой hadoop.Secondary Sort in 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; 
} 
+0

Помогло ли вам использовать метод compareTo? – aventurin

ответ

0

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

0

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

public class SecondarySortBasicPartitioner extends 
    Partitioner<CompositeKeyWritable, NullWritable> { 

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

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

И после этого указать ключ сортировки компаратор и 2 compositeKeyWritable переменных группировка будет сделано.

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^