2012-03-25 18 views
7

Antes de saltar a jugar con Scoobi o Scrunch, pensé que intentaría convertir WordCount a scala (2.9.1) utilizando solo enlaces Java de Hadoop (0.20.1).Scala/Hadoop: Especificación del contexto para Reducer

Originalmente, tenía:

class Map extends Mapper[LongWritable, Text, Text, IntWritable] { 
    @throws[classOf[IOException]] 
    @throws[classOf[InterruptedException]] 
    def map(key : LongWritable, value : Text, context : Context) { 
    //... 

cual compila bien, pero me dio un error de ejecución:

java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable 

Después de mirar un poco, me di cuenta de que era porque yo no era' t definir el método apropiado map (debería haber sido derivado por la falta de override), por lo que lo arreglé para que sea:

override def map(key : LongWritable, value : Text, 
    context : Mapper[LongWritable, Text, Text, IntWritable]#Context) { 

Y listo, no hay error de tiempo de ejecución.

Pero luego miré la salida de trabajo, y me di cuenta de que mi reductor no se estaba ejecutando.

Así que miré a mi reductor, y se dio cuenta de la firma reduce tenía el mismo problema que mi asignador:

class Reduce extends Reducer[Text, IntWritable, Text, IntWritable] { 
    @throws[classOf[IOException]] 
    @throws[classOf[InterruptedException]] 
    def reduce(key : Text, value : Iterable[IntWritable], context : Context) { 
    //... 

Así que adivinó la identidad reduce estaba siendo utilizado debido a la falta de coincidencia.

Pero cuando he tratado de corregir la firma de reduce:

override def reduce(key: Text, values : Iterable[IntWritable], 
    context : Reducer[Text, IntWritable, Text, IntWritable]#Context) { 

ahora tengo un error de compilación:

[ERROR] /path/to/src/main/scala/WordCount.scala:32: error: method reduce overrides nothing 
[INFO]  override def reduce(key: Text, values : Iterable[IntWritable], 

así que no estoy seguro de lo que estoy haciendo mal.

+0

¿Y cuál es la firma reducida que se supone que es? –

+0

@ DanielC.Sobral: Esa es mi pregunta. – rampion

Respuesta

11

A primera vista, asegúrese de que los valores sean java.lang.Iterable, no scala Iterable. Ya importe java.lang.Iterable, o bien:

override def reduce(key: Text, values : java.lang.Iterable[IntWritable], context : Reducer[Text, IntWritable, Text, IntWritable]#Context) 
+2

esto es exactamente correcto. mira aquí para ver un ejemplo: https://bitbucket.org/jasonbaldridge/fogbow/src/6c24fb2afda4/src/main/scala/fogbow/example/WordCount.scala – dhg

Cuestiones relacionadas