2012-02-29 2 views
3

Ну,Порядок сортировки с Hadoop MapRed

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

Благодаря Vellozo

+0

Решенный! http://hadoop.sourcearchive.com/documentation/0.20.2plus-pdfsg1-1/TestComparators_8java-source.html – Vellozo

ответ

7

Если вы используете старую API (mapred.*), затем установите OutputKeyComparatorClass в задании конф:

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

+0

Небольшая ошибка ... У вас нет переменных 'firstL1' и' firstL2'. Я думаю, вы хотели сказать 'l1' и' l2' –

+0

Thx guys ... решение, которое я нашел, почти такое же, как у Raze2dust! Спасибо u! – Vellozo

+0

@PradeepGollakota Спасибо, исправлено это .. –

2

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

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; 

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

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