關於自定義數據類型,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類型即可。