복붙노트

[HADOOP] 변수는 루프로 전달 될 수 없습니다

HADOOP

변수는 루프로 전달 될 수 없습니다

I는 송신기 (ID, INT), 수신기 (ID, INT), 통신 시간 (INT)을 포함하는 데이터 프레임을 가지고있다.

A B C
1 5 10
1 6 20
1 7 20
1 8 11

내 목표는 최대의 통신 시간을 찾아 1 6,20로 반환하는 것입니다 (A, B로 형식, C) 최대 통신 시간 (20)가 모두 A1, B6 및 A1, B7 때문에, 난 그냥 작은 B의 ID 번호를 유지해야합니다.

지도 단계에서 이미 값으로 키로 (B, C를)를 분리.

지금까지 나는 A와 최대 C와 출력을 반환 할 수 있습니다,하지만 난 B 값을 반환하는 문제가있다. 내 코드는 아래의 min_Receiver을 변경할 수 없습니다, 어떻게이 문제를 해결할 수 있습니까?

public static class IntSumReducer
extends Reducer<Text,Text,Text,Text> {
    //private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<Text> values,
                       Context context
                       ) throws IOException, InterruptedException {
        int max_val = 0;
    int val_str = 0;
    int val_str_1 = 0;
    int min_Receiver = Integer.MAX_VALUE;
    int tempReceiver = 0;
        for (Text val : values) {
    String[] compositeString = val.toString().split(",");
    val_str = Integer.parseInt(compositeString[1]);
    //tempReceiver = Integer.parseInt(compositeString[0]);
            if( val_str>max_val) {
                max_val = val_str;

    }


    }

   for (Text val_1 : values){
    String[] compositeString = val_1.toString().split(",");
    tempReceiver = Integer.parseInt(compositeString[0]);        
    val_str_1 = Integer.parseInt(compositeString[1]);

    if (val_str_1 == max_val && tempReceiver < min_Receiver)
        {
           min_Receiver =tempReceiver;
        }

    }

        //result.set(max_val);
        context.write(key, new Text(min_Receiver + "," + max_val));}}

출력이 될 것 기대

1 6,20

실제 출력은

1 2147483647,20

맵에서, I 이미 키로을 분리하고, 값 B, C. 그래서 compositeString는 두 변수가 포함되어 있습니다. 값의 형식은 C B이다.

해결법

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

    1.당신의 구분이 무엇인지에 따라

    당신의 구분이 무엇인지에 따라

    최대 시간 텍스트를 얻기 위해이 같은 줄을 사용

    Text answer = StreamSupport.stream(values.spliterator(),false).max(Comparator.comparingInt(s->getComTime(s))).orElse("");
    

    이 같은 문자열에서 통신 시간을 얻는 방법을 만드는과 함께 :

    private static int getComTime(Text line){
        String[] vals = line.toString().split(",");
        return  Integer.parseInt(vals[2]);
    }
    

    당신이 = 연속 거짓 또는 병렬하려는 경우 .stream ()에 대한 부울 옵션은 = 사실 .... 당신의 구분은 다릅니다 또는 객체는 getComTime을 조정해야 할 수 있습니다 약간의 차이가 있지만, 이것은 오른쪽에 아주 가까이 할 필요가있는 경우 .

  2. from https://stackoverflow.com/questions/58496984/variable-can-not-be-passed-into-for-loop by cc-by-sa and MIT license