參考鏈接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();
}
}