I think when it comes to the TupleWritable being part of a custm writable, you cannot just say tupleWritable.readFields(in) and tupleWritable.write(out)
I might be wrong. Has anyone successfully implemented a TupleWritable with ,say, a DoubleWritable in a custom writable? On Sun, Oct 19, 2008 at 3:33 AM, Joman Chu <[EMAIL PROTECTED]> wrote: > 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); > >> >>> >> > } > >> >>> >> > } > >> >>> >> > } > >> >>> >> > > >> >>> >> > >> >>> > > >> >>> > >> >> > >> >> > >> > > >> > > >