基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter。Filter可以根据簇、列、版本等更多的条件来对数据进行过滤,基于Hbase本身提供的三维有序(主键有序、列有序、版本有序),这些Filter可以高效的完成查询过滤的任务。带有Filter条件的RPC查询请求会把Filter分发到各个RegionServer,是一个服务器端(Server-side)的过滤器,这样也可以降低网络传输的压力。
要完成一个过滤的操作,至少需要两个参数。一个是抽象的操作符,Hbase提供了枚举类型的变量来表示这些抽象的操作符:LESS/LESS_OR_EQUAL/EQUAL/NOT_EUQAL等;另外一个就是具体的比较器(Comparator),代表具体的比较逻辑,如果可以提高字节级的比较、字符串级的比较等。有了这两个参数,我们就可以清晰的定义筛选的条件,过滤数据。

1、行键过滤器 RowFilter

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.RowFilter;

import java.util.List;

public class HbaseFilterTest {

private static final String ZK_CONNECT_KEY = “hbase.zookeeper.quorum”;
private static final String ZK_CONNECT_VALUE = “bigdata111:2181”;

private static Connection conn = null;
private static Admin admin = null;

public static void main(String[] args) throws Exception {

Configuration conf = HBaseConfiguration.create();
conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
conn = ConnectionFactory.createConnection(conf);
admin = conn.getAdmin();
Table table = conn.getTable(TableName.valueOf(“teacher”));

Scan scan = new Scan();

Filter rowFilter = new RowFilter(CompareOperator.EQUAL, new BinaryComparator(“1001”.getBytes()));
scan.setFilter(rowFilter);
ResultScanner resultScanner = table.getScanner(scan);
for (Result result : resultScanner) {
List cells = result.listCells();
for (Cell cell : cells) {
System.out.println(cell);
}
}
}
}

2、列簇过滤器 FamilyFilter

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
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 java.util.List;

public class HbaseFilterTest {

private static final String ZK_CONNECT_KEY = “hbase.zookeeper.quorum”;
private static final String ZK_CONNECT_VALUE = “bigdata111:2181”;

private static Connection conn = null;
private static Admin admin = null;

public static void main(String[] args) throws Exception {

Configuration conf = HBaseConfiguration.create();
conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
conn = ConnectionFactory.createConnection(conf);
admin = conn.getAdmin();
Table table = conn.getTable(TableName.valueOf(“teacher”));

Scan scan = new Scan();

Filter familyFilter = new FamilyFilter(CompareOperator.EQUAL, new BinaryComparator(“contact”.getBytes()));
scan.setFilter(familyFilter);
ResultScanner resultScanner = table.getScanner(scan);
for(Result result : resultScanner) {
List cells = result.listCells();
for(Cell cell : cells) {
System.out.println(cell);
}
}


}
}

3、列过滤器 QualifierFilter

  1. Filter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, new BinaryComparator("name".getBytes()));<br /> scan.setFilter(qualifierFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> System.out.println(cell);<br /> }<br /> }

4、值过滤器 ValueFilter

  1. Filter valueFilter = new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("male"));<br /> scan.setFilter(valueFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> System.out.println(cell);<br /> }<br /> }

5、时间戳过滤器 TimestampsFilter

  1. Scan scan = new Scan();<br /> <br /> List<Long> list = new ArrayList<>();<br /> list.add(1599660833273L);<br /> TimestampsFilter timestampsFilter = new TimestampsFilter(list);<br /> scan.setFilter(timestampsFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> System.out.println(cell.getRowArray() + "\t"<br /> + Bytes.toString(cell.getFamilyArray()) + "\t"<br /> + Bytes.toString(cell.getQualifierArray()) + "\t"<br /> + Bytes.toString(cell.getValueArray()) + "\t"<br /> + cell.getTimestamp());<br /> }<br /> }

专用过滤器

1、单列值过滤器 SingleColumnValueFilter

  1. Scan scan = new Scan();<br /> <br /> SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(<br /> "info".getBytes(),<br /> "name".getBytes(),<br /> CompareOperator.EQUAL,<br /> new SubstringComparator("Jack"));<br /> singleColumnValueFilter.setFilterIfMissing(true);<br /> <br /> scan.setFilter(singleColumnValueFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> System.out.println(cell.getRowArray() + "\t"<br /> + Bytes.toString(cell.getFamilyArray()) + "\t"<br /> + Bytes.toString(cell.getQualifierArray()) + "\t"<br /> + Bytes.toString(cell.getValueArray()) + "\t"<br /> + cell.getTimestamp());<br /> }<br /> }

2、单列值排除器 SingleColumnValueExcludeFilter

  1. Scan scan = new Scan();<br /> <br /> SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(<br /> "info".getBytes(),<br /> "name".getBytes(),<br /> CompareOperator.EQUAL,<br /> new SubstringComparator("Jack"));<br /> singleColumnValueExcludeFilter.setFilterIfMissing(true);<br /> <br /> scan.setFilter(singleColumnValueExcludeFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> System.out.println(cell.getRowArray() + "\t"<br /> + Bytes.toString(cell.getFamilyArray()) + "\t"<br /> + Bytes.toString(cell.getQualifierArray()) + "\t"<br /> + Bytes.toString(cell.getValueArray()) + "\t"<br /> + cell.getTimestamp());<br /> }<br /> }

3、前缀过滤器 PrefixFilter——针对行键

  1. Scan scan = new Scan();<br /> <br /> PrefixFilter prefixFilter = new PrefixFilter("10".getBytes());<br /> <br /> scan.setFilter(prefixFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> //打印略<br /> }<br /> }

4、列前缀过滤器 ColumnPrefixFilter

  1. Scan scan = new Scan();<br /> <br /> ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter("name".getBytes());<br /> <br /> scan.setFilter(columnPrefixFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> //打印略<br /> }<br /> }

5、分页过滤器 PageFilter

  1. Scan scan = new Scan();<br /> <br /> PageFilter columnPrefixFilter = new PageFilter(1);<br /> <br /> scan.setFilter(columnPrefixFilter);<br /> ResultScanner resultScanner = table.getScanner(scan);<br /> for(Result result : resultScanner) {<br /> List<Cell> cells = result.listCells();<br /> for(Cell cell : cells) {<br /> //打印略<br /> }<br /> }