关于自定义数据类型,http://book.douban.com/annotation/17067489/ 一文中给出了一个比较清晰的说明和解释。
在本文中,将给出一个简单的自定义的数据类型例子。我曾使用该自定义的数据类型在HDFS上构建Lucene索引。
package hdfs.document; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import org.apache.hadoop.io.Writable; import org.apache.hadoop.io.WritableUtils; /* * 自定义的一种hadoop输出类型,存储的内容是一个Map<String,String>. */ public class HDFSDocument implements Writable{ HashMap<String,String> fields = new HashMap<String, String>(); public void setFields(HashMap<String,String> fields){ this.fields = fields; } public HashMap<String,String> getFields(){ return this.fields; } @Override public void readFields(DataInput in) throws IOException { fields.clear(); String key = null, value = null; int size = WritableUtils.readVInt(in); for (int i = 0; i < size; i ++){ // 依次读取两个字符串,形成一个Map值 key = in.readUTF(); value = in.readUTF(); fields.put(key,value); } } } @Override public void write(DataOutput out) throws IOException { String key = null, value = null; Iterator<String> iter = fields.keySet().iterator(); while(iter.hasNext()){ key = iter.next(); value = fields.get(key); // 依次写入<Key,Value>两个字符串 out.writeUTF(key); out.writeUTF(value); } } }
在MapReduce中使用时,设置相应的Map或Reduce的class类型即可。