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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值