Переменная не может быть передана в цикл for - PullRequest
0 голосов
/ 22 октября 2019

У меня есть фрейм данных, включающий отправителя (id, int), получателя (id, int), время связи (int).

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

Моя цель состоит в том, чтобы найти максимальное время связи и вернуть значение 1 6,20 (формат как AB, C) Поскольку у A1, B6 и A1, B7 оба имеют максимальное время связи 20, мне просто нужносохранить наименьшее число B id.

На шаге карты я уже выделил A как ключ, (B, C) как значение.

Пока что я могу вернуть выход с A и max 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

На карте я уже выделил A как ключ и B, Cкак ценность. Таким образом, составная строка содержит две переменные. Формат в значении - B, C.

1 Ответ

0 голосов
/ 22 октября 2019

В зависимости от того, какой у вас разделитель

, используйте такую ​​строку, чтобы получить Text с максимальным временем

Optional<Text> answer = StreamSupport.stream(values.spliterator(),false)  //all this does is get you a stream of Text
.max(Comparator.comparingInt(s->getComTime(s))); // return the object that evaluates to the max value if one exists

вместе с созданием метода, который получает время связи отстрока / текст наподобие этого:

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

логический параметр для .stream () - если вы хотите, чтобы последовательный = false или параллельный = true .... если ваш разделитель отличается илиобъект немного отличается, вам может потребоваться настроить getComTime, но это должно быть довольно близко к праву.

получите Необязательный, если вы хотите справиться с этим.

тогда вы можете сделать

if(answer.isPresent()){/* got an answer do something with it */}

*** Извините, я сделал большую часть этого со строками вместо текста, но это обновлено, дайте мне знать, если есть какие-либо проблемы.

...