Отсортированный подсчет слов с помощью MapReduce Hadoop

Я очень плохо знаком с MapReduce, и я завершил пример Hadoop для подсчета количества слов.

В том примере это производит неотсортированный файл (с парами "ключ-значение") подсчетов слов. Таким образом, действительно ли возможно отсортировать его по количеству встречаемостей слова путем объединения другой задачи MapReduce с более ранней?

10
задан Mechanical snail 7 March 2012 в 00:32
поделиться

2 ответа

Вывод из примера количества слов Hadoop MapReduce сортируется по ключу. Таким образом, вывод должен быть в алфавитном порядке.

С помощью Hadoop вы можете создавать свои собственные ключевые объекты, реализующие интерфейс WritableComparable , позволяющий переопределить метод compareTo . Это позволяет вам контролировать порядок сортировки.

Чтобы создать вывод, отсортированный по количеству событий, вам, вероятно, придется добавить еще одно задание MapReduce для обработки вывода из первого, как вы сказали. Эта вторая работа будет очень простой и, возможно, даже не потребует фазы сокращения. Вам просто нужно будет реализовать собственный ключевой объект Writable , чтобы обернуть слово и его частоту. Настраиваемая возможность записи выглядит примерно так:

 public class MyWritableComparable implements WritableComparable {
       // Some data
       private int counter;
       private long timestamp;

       public void write(DataOutput out) throws IOException {
         out.writeInt(counter);
         out.writeLong(timestamp);
       }

       public void readFields(DataInput in) throws IOException {
         counter = in.readInt();
         timestamp = in.readLong();
       }

       public int compareTo(MyWritableComparable w) {
         int thisValue = this.value;
         int thatValue = ((IntWritable)o).value;
         return (thisValue < thatValue ? -1 : (thisValue==thatValue ? 0 : 1));
       }
     }

Я взял этот пример из здесь .

Вам, вероятно, следует переопределить hashCode , равно и toString .

0
ответ дан 4 December 2019 в 04:53
поделиться

В Hadoop сортировка выполняется между этапами сопоставления и сокращения. Один из подходов к сортировке по появлению слов - использовать настраиваемый групповой компаратор, который ничего не группирует; следовательно, каждый вызов функции reduce - это всего лишь ключ и одно значение.

public class Program {
   public static void main( String[] args) {

      conf.setOutputKeyClass( IntWritable.class);
      conf.setOutputValueClass( Text.clss);
      conf.setMapperClass( Map.class);
      conf.setReducerClass( IdentityReducer.class);
      conf.setOutputValueGroupingComparator( GroupComparator.class);   
      conf.setNumReduceTasks( 1);
      JobClient.runJob( conf);
   }
}

public class Map extends MapReduceBase implements Mapper<Text,IntWritable,IntWritable,Text> {

   public void map( Text key, IntWritable value, OutputCollector<IntWritable,Text>, Reporter reporter) {
       output.collect( value, key);
   }
}

public class GroupComaprator extends WritableComparator {
    protected GroupComparator() {
        super( IntWritable.class, true);
    }

    public int compare( WritableComparable w1, WritableComparable w2) {
        return -1;
    }
}
0
ответ дан 4 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: