欢迎投稿

今日深度:

【Hadoop】hadoop中实现ListWritable,

【Hadoop】hadoop中实现ListWritable,


在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);                           //还在查找为何如此
			}



www.htsjk.Com true http://www.htsjk.com/Hadoop/40125.html NewsArticle 【Hadoop】hadoop中实现ListWritable, 在hadoop中一切可以传递和读写到hbase的数据都是以XXWritable的形式来处理的。如果你想实现一个自己的一个可读写的数据类型,则必须继承Writable接口。然...
相关文章
    暂无相关文章
评论暂时关闭