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.
¿Y cuál es la firma reducida que se supone que es? –
@ DanielC.Sobral: Esa es mi pregunta. – rampion