hrm, try implementing the read(DataInput in) method, as well as a
blank constructor MyWritable() that fills dummy values into your
instance variables. For example this should be all you need for
read(DataInput in),

public static MyWritable read(DataInput in) throws IOException {
        MyWritable w = new MyWritable();
        w.readFields(in);
        return w;
}

EDIT: I was able to sort of replicate your error. In my constructor, i
had my instance variables assigned to null. Make sure you assign them
to new instances of whatever Writable you are using.


Joman Chu
http://www.notatypewriter.com/
AIM: ARcanUSNUMquam



On Sun, Oct 19, 2008 at 5:10 AM, Yih Sun Khoo <[EMAIL PROTECTED]> wrote:
> Joman to add a little bit more to one of my previous mails about the
> readFields methods
>
> Have you ever had something like this?
>
> public class MyWritable implements Writable {
>    private DoubleWritable doubleWritable;
>    private TupleWritable tupleWritable;
>
>    public void readFields(DataInput in) throws IOException {
>        doubleWritable.readFields(in);
>        tupleWritable.readFields(in);
>    }
>
>    public void write(DataOutput out) throws IOException {
>        doubleWritable.write(out);
>        tupleWritable.write(out);
>    }
>
>
> }
>
> On Sun, Oct 19, 2008 at 1:59 AM, Joman Chu <[EMAIL PROTECTED]> wrote:
>
>> I've never used TupleWritable, so hopefully somebody else can help you
>> with that.
>> Joman Chu
>> http://www.notatypewriter.com/
>> AIM: ARcanUSNUMquam
>>
>>
>>
>> On Sun, Oct 19, 2008 at 4:40 AM, Yih Sun Khoo <[EMAIL PROTECTED]> wrote:
>> > Also, I've noticed TupleWritable to be quite useful.
>> > What are good techniques for using TupleWritable in a mapping phase for a
>> > "list of Text" when you do not know the size of that "list" ahead of time
>> >
>> > Say I had a custom writable which implemented TupleWritable and the
>> custom
>> > writable contained a setter method
>> > mycustomwritable.setTupleWritable( ...  )
>> >
>> > Where the ellipsis is, there lies the TupleWritable.  However I'm
>> wondering
>> > since TupleWritable can be constructed using TupleWritable(Writable[]),
>> how
>> > do I dynamically resize the Writable[] and add Text elements to it when I
>> > don't know the size of the Writable[] very well.  Does this make sense?
>> >
>> >
>> > On Sun, Oct 19, 2008 at 1:32 AM, Yih Sun Khoo <[EMAIL PROTECTED]> wrote:
>> >
>> >> Let's say in the reduce phase your value happens to hold an
>> >> ArrayListWritable
>> >> In this example, value is of type ArrayListWritable
>> >> Maybe I've not thought about this or done this before, but how does one
>> >> "read data in from the DataInput stream" in the reduce phase so that the
>> >> ArrayListWritable which is a value already passed to the reducer can be
>> used
>> >> as ArrayListWritable
>> >>
>> >>
>> >> On Sun, Oct 19, 2008 at 1:25 AM, Joman Chu <[EMAIL PROTECTED]> wrote:
>> >>
>> >>> Since the ArrayListWritable extends ArrayList, you have access to all
>> >>> the ArrayList methods as well. Once you read data in from the
>> >>> DataInput stream, you should be able to use ArrayListWritable just
>> >>> like a regular ArrayList.
>> >>> Joman Chu
>> >>> http://www.notatypewriter.com/
>> >>> AIM: ARcanUSNUMquam
>> >>>
>> >>>
>> >>>
>> >>> On Sun, Oct 19, 2008 at 4:16 AM, Yih Sun Khoo <[EMAIL PROTECTED]>
>> wrote:
>> >>> > Hmm, what method from ArrayListWritable allows you to access the
>> >>> different
>> >>> > elements of the ArrayList?  Would it be readFields?  for example, in
>> a
>> >>> > reduce phase, if I needed to know the size of the array list, it
>> would
>> >>> be
>> >>> > easy if i were dealing with an arraylist because i could just say
>> >>> > arraylist.size.  How would i accomplish that with the writable
>> >>> counterpart?
>> >>> >
>> >>> > On Sun, Oct 19, 2008 at 1:04 AM, Joman Chu <[EMAIL PROTECTED]>
>> wrote:
>> >>> >
>> >>> >> Hi,
>> >>> >>
>> >>> >> For the ArrayList object, try taking a look at the implementation of
>> >>> >> ArrayListWritable by Jimmy Lin at UMD here:
>> >>> >>
>> >>> >>
>> >>> >>
>> >>>
>> https://subversion.umiacs.umd.edu/umd-hadoop/core/trunk/src/edu/umd/cloud9/io/ArrayListWritable.java
>> >>> >>
>> >>> >> But basically in the readFields methods, I prefer using each
>> Writable
>> >>> >> object's readFields method to read the data in. For example, for
>> your
>> >>> >> double variable, I would use a DoubleWritable object and in the
>> >>> >> MyWritable.readFields(DataInput in), I would use
>> >>> >> nameofdoublewritable.readFields(in). For the
>> >>> >> MyWritable.write(DataOutput out) method, I would use
>> >>> >> nameofdoublewritable.write(out).
>> >>> >>
>> >>> >> Have a good one,
>> >>> >>
>> >>> >> Joman Chu
>> >>> >> http://www.notatypewriter.com/
>> >>> >> AIM: ARcanUSNUMquam
>> >>> >>
>> >>> >>
>> >>> >>
>> >>> >> On Sun, Oct 19, 2008 at 3:30 AM, Yih Sun Khoo <[EMAIL PROTECTED]>
>> >>> wrote:
>> >>> >> > I don't quite know how to write the read and write functions, but
>> I
>> >>> want
>> >>> >> to
>> >>> >> > write my own writable, which should have a DoubleWritable/double
>> >>> value
>> >>> >> > followed by a list of Strings/Text.  This Writable will be used as
>> a
>> >>> >> value.
>> >>> >> > Is the code below the best way to go about writing such a
>> writable?
>> >>> >> >
>> >>> >> > import java.io.DataInput;
>> >>> >> > import java.io.DataOutput;
>> >>> >> > import java.io.EOFException;
>> >>> >> > import java.io.IOException;
>> >>> >> > import java.util.ArrayList;
>> >>> >> >
>> >>> >> > import org.apache.hadoop.io.Writable;
>> >>> >> >
>> >>> >> > public class MyWritable implements Writable {
>> >>> >> >    private double score;
>> >>> >> >    private ArrayList<String> nameList;
>> >>> >> >
>> >>> >> >    public void setScore(double score) {
>> >>> >> >        this.score= score;
>> >>> >> >    }
>> >>> >> >
>> >>> >> >    public void setNameList(ArrayList<String> nameList) {
>> >>> >> >        this.nameList= nameList;
>> >>> >> >    }
>> >>> >> >
>> >>> >> >    public double getScore() {
>> >>> >> >        return score;
>> >>> >> >    }
>> >>> >> >
>> >>> >> >    public ArrayList<String> getNameList() {
>> >>> >> >        return nameList;
>> >>> >> >    }
>> >>> >> >
>> >>> >> >    public void readFields(DataInput in) throws IOException {
>> >>> >> >        score= in.readDouble();
>> >>> >> >        try {
>> >>> >> >            do {
>> >>> >> >                nameList.add(in.readUTF());
>> >>> >> >            } while (true);
>> >>> >> >        } catch (EOFException eofe) {
>> >>> >> >            // continue; done
>> >>> >> >        }
>> >>> >> >    }
>> >>> >> >
>> >>> >> >    public void write(DataOutput out) throws IOException {
>> >>> >> >        out.writeDouble(score);
>> >>> >> >        for (String name: nameList) {
>> >>> >> >            out.writeUTF(name);
>> >>> >> >        }
>> >>> >> >    }
>> >>> >> > }
>> >>> >> >
>> >>> >>
>> >>> >
>> >>>
>> >>
>> >>
>> >
>>
>

Reply via email to