hbase自定義filter

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章