MapWritable в Reducer не удалось преобразовать в Java Integer - PullRequest
0 голосов
/ 10 октября 2019

Я работаю над проблемой уменьшения карты. Мои выходные данные функции карты (... Text, MapWritable) и входные данные моего редуктора (Text, MapWritable ...)

MapWritable содержит два значения, цель и вес, определяемые следующим образом:

mappW.put(new Text("tgt"), new IntWritable(Integer.parseInt(data[1])));
mappW.put(new Text("weight"), new IntWritable(Integer.parseInt(data[2])));
context.write(textKey, mapperW);

Моя проблема связана с доступом к данным в функции редуктора. Я получаю сообщение об ошибке:

org.apache.hadoop.io.Writable cannot be converted to java.lang.Integer

Эту ошибку трудно отладить, поскольку я не смог найти ничего, связанного с записываемыми файлами, преобразуемыми в int.

Любая помощь в правильном направлениибыло бы замечательно. Приведенный ниже код описывает, как я реализую MapWritable в функции карты и код редуктора.

public static class WeightReducer
    extend Reducer<Text, MapWritable, Text, Text> {

    public void reduce(Text key, Iterable<MapWritable> values, Context context
                       ) throws IOException, InterruptedException {

    int maxTgt;
    maxTgt = 0;
    int maxWeight;
    maxWeight = 0;

    for (MapWritable value : values) {
        int curr_tgt = value.get(new Text("tgt"));
        int curr_weight = value.get(new Text("weight"));

        if (curr_weight > maxWeight) {
            /* store this data into maxWeight and maxTgt */
        } else if (curr_weight.equals(maxWeight) && curr_tgt < maxTgt) {
            /* update maxWeight and maxTgt */
        }
     /*convert maxTgt and maxWeight to strings, concatenate them and write */
     String tgtString = Integer.toString(maxTgt);
     String tgtWeight = Integer.toString(maxWeight);
     String output = tgtString + ", " + tgtWeight;
     Text outText = new Text(output);
     context.write(key, outText);
    }



  }

}
...