参考链接http://mysun.iteye.com/blog/1584635
http://blackproof.iteye.com/blog/1924610
1: 实现FilterBase接口或者重启其它已实现的filter,重载一下某一方法
filterRowKey根据RK决定行是否被过滤,ex Profix
filterKeyValue根据KV决定行或列(ReturnCode)是否被过滤,
ex ColumnProfix ColumnCompare
filterRow(keyvalues)根据制定列值决定行是否过滤,
ex DependentColumnFilter
filterRow在之前Filter结束后,进行过滤,ex PageFilter
reset当一行读完,为了读下一行,清空当前行数据
filterAllRemainning当返回true,停止scan
2:jar包上传到所有regionserver所在的lib下,客户端即可调用
示例:
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterBase;
import org.apache.hadoop.hbase.filter.WritableByteArrayComparable;
import org.apache.hadoop.hbase.io.HbaseObjectWritable;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Classes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MySkipFilter extends FilterBase
{
private boolean filterRow = true;
private Filter filter;
public String name;
public static Logger logger = LoggerFactory.getLogger(HylandaSkipFilter.class);
public MySkipFilter ()
{
}
public MySkipFilter (Filter filter,String name)
{
this.filter = filter;
this.name = name;
logger.warn("name="+name+" SkipFilterA()");
}
private void changeFR(boolean value)
{
this.filterRow = value;
logger.warn("name="+name+"changeFR(),"+filterRow);
}
public Filter.ReturnCode filterKeyValue(KeyValue v)
{
logger.warn("qualifier="+Bytes.toString(v.getBuffer(), v.getQualifierOffset(),v.getQualifierLength()));
if(Bytes.toString(v.getBuffer(), v.getQualifierOffset(),v.getQualifierLength()).startsWith("dd_"))
{
Filter.ReturnCode c = this.filter.filterKeyValue(v);
if(c == Filter.ReturnCode.INCLUDE)
{
changeFR(false);
logger.warn("name="+name+"filterRow(),chmod="+filterRow);
}
}
//changeFR(c == Filter.ReturnCode.INCLUDE);
return Filter.ReturnCode.INCLUDE;
}
public KeyValue transform(KeyValue v)
{
return this.filter.transform(v);
}
public boolean filterRow()
{
logger.warn("name="+name+"filterRow(),filterRow="+filterRow);
return this.filterRow;
}
public void write(DataOutput out) throws IOException
{
out.writeUTF(this.filter.getClass().getName());
out.writeUTF(this.name);
this.filter.write(out);
}
public void readFields(DataInput in) throws IOException
{
this.filter = Classes.createForName(in.readUTF());
this.name=in.readUTF();
this.filter.readFields(in);
}
public boolean isFamilyEssential(byte[] name)
{
return FilterBase.isFamilyEssential(this.filter, name);
}
public String toString()
{
return getClass().getSimpleName() + " " + this.filter.toString();
}
}