1.缓存优化
在hbase的java api 中,默认在scan 过程中scan.next一次进行一次rpc请求,这导致scan的效率很低,设置scan的缓存优化很有必要
1.scan.setBatch(int 10),设置一次next 返回的列数的缓存,针对表中的数据有多列的时候应设置此项.
2.scan.setCaching(10); 十次next,一次rpc请求,通过此项的设置可以减少rpc的请求
2.scan过滤器
过滤器相当于数据库中的where子句,比较的方式有
1)二进制比较 大于、小于。。。。
new BinaryComparator(Bytes.toBytes("xxx"));
2)正则比较 等于或不等于
new RegexStringComparator();
3)子串比较 等于或不等于
过滤器是将过滤器代码序列化,通过rpc交给服务端处理,服务端处理完成后返回给客户端
1.RowFilter:行过滤,过滤指定的行
RowFilter filter2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row097")));
2.FamilayFilter:列族过滤,返回指定的列族
3.QualifierFilter:返回指定的列
4.ValueFilter:过滤值
当多个过滤器共同作用时,使用FilterList(parm1 :条件的and 或者or)
/** !AND */ MUST_PASS_ALL, /** !OR */ MUST_PASS_ONE
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class TestFilter {
@Test
public void TestFilter1() throws IOException {
Configuration cong = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(cong);
TableName tableName = TableName.valueOf("test2:t1");
Table table = connection.getTable(tableName);
Scan scan = new Scan();
scan.setBatch(3);//设置批次返回的列数,对于多列的数据是一个很好的优化
scan.setCaching(10);//设置返回的行数
//new FamilyFilter(, )
FamilyFilter filter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("f1"));
RowFilter filter2 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row097")));
QualifierFilter name = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("name"));
FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filter,filter2);
FilterList flist= new FilterList(FilterList.Operator.MUST_PASS_ALL);
flist.addFilter(name);//多个过滤器是定义的Filterlist可以定义多个,也可同时添加过滤器列表
flist.addFilter(fl);
// filterList.addFilter(filter);
// filterList.addFilter(filter2);
scan.setFilter(flist);
ResultScanner scanner = table.getScanner(scan);
Result next =null;
while (( next=scanner.next())!=null){
List<Cell> list = next.listCells();
for (Cell cell : list) {
String row = Bytes.toString(cell.getRow());
String fam =Bytes.toString( CellUtil.cloneFamily(cell));
String qq =Bytes.toString( CellUtil.cloneQualifier(cell));
String val = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(row+"\t"+fam+"\t"+qq+"\t"+val);
}
}
}
}