Quiero tomar un valor promedio de una temperatura dada en un archivo de entrada y mi Mapper y Reductor de synatax parece bien a mí, pero yo todavía estoy recibiendo el siguiente error:

 Unable to load realm info from SCDynamicStore
    13/02/17 08:03:28 INFO mapred.JobClient: Task Id : attempt_201302170552_0009_m_000000_1, Status : FAILED
    java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.IntWritable
        at org.apache.hadoop.examples.TempMeasurement$TempMapper.map(TempMeasurement.java:26)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)

Mi Asignador de la función es este:

public static class TempMapper extends Mapper<IntWritable, Text, IntWritable, FloatWritable>{

@Override
protected void map(IntWritable key, Text value, Context context)
                throws IOException, InterruptedException {

    //code for getting date and temperature

    String temp = columns.get(3);
    context.write(new IntWritable(year), new FloatWritable(Float.valueOf(temp)));
}
}

Y Reducir es:

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

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

      //code for making calculations    

      context.write(key, result);
    }
  }

Archivo de entrada es:

11111 , 0,19900101, 44.04 ,
11112, 0, 19900102, 50.00,
11113, 3, 19910203, 30.00,

Cualquier ayuda se agradece

OriginalEl autor Junaid | 2013-02-17

1 Comentario

  1. 8

    La clave de clase de un mapper que los mapas de archivos de texto es siempre LongWritable. Esto es debido a que contiene el offset de byte de la línea actual y esto podría fácilmente desbordamiento de un entero.

    Básicamente, usted necesita cambiar su código para esto:

    public static class TempMapper extends Mapper<LongWritable, Text, IntWritable, FloatWritable>{
    
      @Override
      protected void map(LongWritable key, Text value, Context context)
                    throws IOException, InterruptedException {
           //code for getting date and temperature
           String temp = columns.get(3);
           context.write(new IntWritable(year), new FloatWritable(Float.valueOf(temp)));
      }
    }
    Me había puesto Objeto cuando me di cuenta antes de tu respuesta y que fue compilado con éxito. Pero supongo que, LongWritable sería más apropiado utilizar aquí. Gracias por la respuesta.

    OriginalEl autor Thomas Jungblut

Dejar respuesta

Please enter your comment!
Please enter your name here