You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mapreduce-user@hadoop.apache.org by Anuja Kulkarni <an...@yahoo.com> on 2011/10/04 18:46:57 UTC

Can we use Inheritance hierarchy to specify the outputvalue class for mapper which is also inputvalue class for the reducer ?

Hi,

We have class hierarchy for output value for both mapper as well as reducer class   as parent (abstract class) , child1,child2,… 
 
We have mapper class which is 
specified with its outputvalue class as parent class ; the map function 
will emit  either  child1 or child2 depending on the logic we used ( 
and reducer is having its inputvalue class as parent class).
 
But we are getting error as  "java.io.IOException: Type mismatch in value from map: expected parent classreceived child class”
 So is this possible to specify parent class as output/inputvalue class in case of mapper as well as in reducer ; since we want to follow some object-oriented approach. What will be the correct way of achieving this ?


- Anuja

Re: Can we use Inheritance hierarchy to specify the outputvalue class for mapper which is also inputvalue class for the reducer ?

Posted by Kamesh <ka...@imaginea.com>.
On Tuesday 04 October 2011 10:16 PM, Anuja Kulkarni wrote:
> Hi,
>
> We have class hierarchy for output value for both mapper as well as 
> reducer class   as parent (abstract class) , child1,child2,…
> We have mapper class which is specified with its outputvalue class as 
> parent class ; the map function will emit  either  child1 or child2 
> depending on the logic we used ( and reducer is having its inputvalue 
> class as parent class).
> But we are getting error as "*java.io.IOException: Type mismatch in 
> value from map: expected **parent classreceived child class”*
> So is this possible to specify parent class as output/inputvalue class 
> in case of mapper as well as in reducer ; since we want to follow some 
> object-oriented approach. What will be the correct way of achieving this ?
>
>
> - Anuja
Hi Anuja,

bq. So is this possible to specify parent class as output/inputvalue 
class in case of mapper as well as in reducer ;

I **think** it is not possible.

bq. What will be the correct way of achieving this ?

I feel the following approach works (there could be a better way of 
doing this)

Create a TupleWritable instance with either child1 or child2 array as an 
argument based on your logic at the mapper side and write the same 
TupleWritable instance as a value of Mapper output value.

At the reducer side, get the writable type from the TupleWritable and do 
instanceof check to determine the appropriate value type.

-- 
Thanks&Regards,
Bh.V.S.Kamesh.