복붙노트

[HADOOP] 열쇠에 대한 최대 가치 발견

HADOOP

열쇠에 대한 최대 가치 발견

나는 가장 큰 지역을 가진 가장 큰 나라를 찾고 싶다.

내 데이터 세트는 다음과 같습니다.

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 프로그램을 쓸 수 있습니까?

내 매퍼 및 감속기 코드는 다음과 같습니다.

매퍼

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])));
        }
    }

감속기

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));
    }

해결법

  1. ==============================

    1.알고리즘은 쉽습니다. 매퍼에서 최대를 수집하고 매퍼의 끝에 정리를 사용하여 디스크에 기록합니다.

    알고리즘은 쉽습니다. 매퍼에서 최대를 수집하고 매퍼의 끝에 정리를 사용하여 디스크에 기록합니다.

    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;
            }              
    }
    
  2. from https://stackoverflow.com/questions/31325846/finding-biggest-value-for-key by cc-by-sa and MIT license