在hadoop中一切可以传递和读写到hbase的数据都是以XXWritable的形式来处理的。如果你想实现一个自己的一个可读写的数据类型,则必须继承Writable接口。然后在map或者reduce中使用。hadoop中已经有一些默认实现的课读写对象,比如int,long等。因为开发,需要一个list类型的课读写对象,但是hadoop中没有默认实现。虽然mahout中有一种类似的VectorWritable的实现,但是当时懒的去找mahuot依赖所以就自己写了一个。
作为一个ListWritable来说,其实现大体有两种场景。第一种,其内的对象是Writable的,这种最好实现;第二种是其内的对象不是Writable的,这时候你就需要重写其write与read方法才可以。第二种暂时没有代码实现,现在只贴出第一种代码实现:
package com.hadoop;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Writable;
public class ListWritable<E extends Writable> implements Writable {
/**
*
*/
private List<E> instance;
public ListWritable() {
super();
}
public ListWritable(List<E> instance) {
this.instance = instance;
}
public void push(E e) {
if (instance == null) {
instance = new ArrayList<E>();
}
instance.add(e);
}
public int size() {
return instance.size();
}
//注意一定要覆盖toString方法,否则输出的将会是一个对象形式,而不是各个元素
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append("[");
for(E e : instance){
sb.append(e.toString() + ",");
}
String result = (String) sb.subSequence(0, sb.length() - 1);
return result + "]";
}
@Override
public void write(DataOutput out) throws IOException {
// TODO Auto-generated method stub
}
@Override
public void readFields(DataInput in) throws IOException {
// TODO Auto-generated method stub
}
}
使用代码样例:
List<LongWritable> instance = new ArrayList<LongWritable>();
Iterator<LongWritable> iterator = valueIn.iterator();
while (iterator.hasNext()) {
LongWritable e = iterator.next();
LongWritable lw = new LongWritable(e.get());//这个地方一定要每次new一个对象出来,否则列表内的元素将会是一样的
instance.add(lw); //还在查找为何如此
}