2015-07-09 3 views
1

Я хочу найти самую большую страну с наибольшей площадью.Найти наибольшее значение для ключа

мои набор данных выглядит следующим образом

Afghanistan 648 
Albania 29 
Algeria 2388 
Andorra 0 
Austria 84 
Bahrain 1 
Bangladesh 143 
Belgium 31 
Benin 113 
Bhutan 47 
Brunei 6 
Bulgaria 111 
Burma 678 
Cameroon 474 
Central-African-Republic 623 
Chad 1284 
China 9561 
Cyprus 9 
Czechoslovakia 128 
Denmark 43 
Djibouti 22 
Egypt 1001 
Equatorial-Guinea 28 
Ethiopia 1222 
Finland 337 
France 547 
Germany-DDR 108 
Germany-FRG 249 
Greece 132 
Guam 0 
Hong-Kong 1 
Hungary 93 
India 3268 

Может кто-нибудь помочь мне написать программу MapReduce?

Мой картографа и редуктор код этой

Mapper

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{ 
     String[] tokens = value.toString().split(","); 
     if(Integer.parseInt(tokens[2]) == 1){ 
      context.write(new Text(tokens[0]), new IntWritable(Integer.parseInt(tokens[3]))); 
     } 
    } 

Reducer

public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException, InterruptedException{ 
     int max = 0; 
     for(IntWritable x : values){ 
      if(max < Integer.parseInt(String.valueOf(x))){ 
       max = Integer.parseInt(String.valueOf(x)); 
      } 
     } 
     context.write(key, new IntWritable(max)); 
    } 
+0

Итак, что вы пытались и где вы застряли? Stackoverflow не является службой написания кода. –

+0

Спасибо за ответ @ThomasJungblut, я отредактировал мой вопрос и добавил код картера и редуктора, у меня чего-то не хватает в реализации логики. – Qasim

ответ

1

Алгоритм прост в картографа вы собрать максимум и в конце вашего картографа вы пишете его на диск, используя cleanup.

int max = Integer.MIN_VALUE; 
String token; 

@Override 
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
     String[] tokens = value.toString().split(","); 
     if(Integer.parseInt(tokens[2]) == 1){  
      int val = Integer.parseInt(tokens[3]) 
      if(Integer.parseInt(tokens[3]) > max){ 
       max = val; 
       token = tokens[0]; 
      } 
     } 
} 

@Override 
public void cleanup(Context context) throws IOException, InterruptedException {  
    context.write(new LongWritable(max), new Text(token));  
} 

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

job.setSortComparatorClass(LongWritable.DecreasingComparator.class); 

Редуктор является просто нашли/не обретенной переключатель, который просто выводит каждую страну, если она имеет максимальное значение (первая запись).

boolean foundMax = false; 

@Override 
public void reduce(LongWritable key, Iterable<Text> values, Context context) throws IOException, InterruptedException{ 
     if(!foundMax){ 
      for(Text t : values){ 
       context.write(t, key); 
      } 
      foundMax = true; 
     }    
} 
+0

Итак, @ThomasJunglblut мы не устанавливаем ключ и значение на карте, а какая роль cleanUp и когда она называется? – Qasim

+0

«Очистка» - это окончательная операция картографа. –

+0

Спасибо, что он работает ... но я хочу знать, что мы не устанавливаем ключевые значения в контексте mapper, а затем, как значения передаются в редуктор, вы можете показать мне архитектурный вид в этом конкретном случае, если его легко описать для вы – Qasim

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