java.lang.Object не может быть преобразован в собственный класс - PullRequest
1 голос
/ 16 октября 2019

Я новичок в java / hadoop и в настоящее время пытаюсь воссоздать результаты кода, который я нашел здесь: https://sunilmistri.wordpress.com/2015/02/13/mapreduce-example-for-minimum-and-maximum-value-by-group-key/

В отличие от примера, у меня есть только 3 "столбца", каждый сцелое число, разделенное символом табуляции (/ t), например 100 115 3 Первые два числа являются узлами, третье - вес между узлами. Теперь я пытаюсь найти минимальные и максимальные веса для первого узла. Единственное, что я изменил в коде, это разделитель (/ t) и то, что я поместил оба класса в один файл (что, как я прочитал, должно быть в порядке). Теперь я получаю сообщение об ошибке «java.lang. Объект не может быть преобразован в minmaxduration» в строке, указанной ниже. Я нашел похожие вопросы, такие как несовместимые типы: java.lang. Объект не может быть преобразован в T , но это мне не очень помогло. Как я могу это исправить? Заранее спасибо.

import java.io.IOException;
import java.io.DataInput;
import java.io.DataOutput;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.io.*;
import org.apache.hadoop.util.*;

import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class Q1{

  public static class DurationMapper
       extends Mapper<Object, Text, Text, MinMaxDuration>{

    private Text month= new Text();
    private Integer minduration;
    private Integer maxduration;


    private MinMaxDuration outPut= new MinMaxDuration();

    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {

        String[] campaignFields= value.toString().split("/t");
        //10001,'telephone','may','mon',100,1,999,0,'nonexistent','no',0
        month.set(campaignFields[0]);
        minduration=Integer.parseInt(campaignFields[2]);
        maxduration=Integer.parseInt(campaignFields[2]);

        if (month == null || minduration == null || maxduration== null) {
            return;
        }   
        try {
            outPut.setMinDuration(minduration);
            outPut.setMaxDuration(maxduration);
            context.write(month,outPut);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
     }
  }

  public static class DurationReducer
       extends Reducer<Text,MinMaxDuration,Text,MinMaxDuration> {
      private MinMaxDuration resultRow = new MinMaxDuration();

     public void reduce(Text key, Iterable values,
                       Context context
                       ) throws IOException, InterruptedException {
      Integer minduration = 0;
      Integer maxduration = 0;

      resultRow.setMinDuration(null);
      resultRow.setMaxDuration(null);

      for (MinMaxDuration val : values) { //ERROR HERE

          minduration = val.getMinDuration();
          maxduration = val.getMaxDuration();
          // get min score 
          if (resultRow.getMinDuration()==null || minduration.compareTo(resultRow.getMinDuration())<0) {
        resultRow.setMinDuration(minduration);
        }            
      // get min bonus                       
      if (resultRow.getMaxDuration()==null || maxduration.compareTo(resultRow.getMaxDuration())>0) {
            resultRow.setMaxDuration(maxduration);
        }
       } // end of for loop
     context.write(key, resultRow);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "Campaign Duration Count");
    job.setJarByClass(CampaignMinMax.class);
    job.setMapperClass(DurationMapper.class);
    job.setCombinerClass(DurationReducer.class);
    job.setReducerClass(DurationReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(MinMaxDuration.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

class MinMaxDuration implements Writable {
    // declare variables
    Integer minDuration;
    Integer maxDuration;
    // constructor
    public MinMaxDuration() {
        minDuration=0;
        maxDuration=0;
    }
    //set method
    void setMinDuration(Integer duration){
        this.minDuration=duration;
    }
    void setMaxDuration(Integer duration){
        this.maxDuration=duration;
    }
    //get method
    Integer getMinDuration() {
        return minDuration;
    }
    Integer getMaxDuration(){
        return maxDuration;
    }

    // write method
            public void write(DataOutput out) throws IOException {
            // what order we want to write !
                out.writeInt(minDuration);
                out.writeInt(maxDuration);
        }

         // readFields Method
        public void readFields(DataInput in) throws IOException {
            minDuration=new Integer(in.readInt());
            maxDuration=new Integer(in.readInt());
        }

        public String toString() {
            return minDuration + "\t" + maxDuration;
        }

  }



1 Ответ

1 голос
/ 17 октября 2019

Вам не хватает спецификации типа в сигнатуре метода. Таким образом, он будет считаться общим Object, а не вашим конкретным типом. Поэтому измените сигнатуру метода с

public void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException 

на

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

Таким образом, вы указали правильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...