Hadoop中 使用自定义的Writable,作为value在map和reduce传递参数。
似乎自始至终,传递参数时只有一个Writable存在。这个Writable采用readFields和write改变自身的值,然后传给reduce。因此在重载这两个函数的时候,一定要将上一个Writable的所有东西全部清除,在进行readFields
比如:
public class NodeInforWritable implements WritableComparable<NodeInforWritable> {
public int nodeID=-1;
public int[] ajacentNodeList=null;
public ArrayList<Integer> epsAjacentNodeList=null;
@Override
public void readFields(DataInput in) throws IOException
{
//in.readChar();
nodeID=in.readInt();
int ajacentnodecount=in.readInt();
ajacentNodeList=new int[ajacentnodecount];
for(int i=0;i<ajacentnodecount;i++)
{
ajacentNodeList[i]=in.readInt();
}
int epsneighborcount=in.readInt();
epsAjacentNodeList=new ArrayList<Integer>();
if(epsneighborcount!=0)
{
for(int i=0;i<epsneighborcount;i++)
{
epsAjacentNodeList.add(in.readInt());
}
}
}
}
该类中的epsAjacentNodeList和ajacentNodeList都必须赋一个新的值,否则的话,之后在reduce中会出现很多的莫名奇妙的自定义Writable。