- 概念
HBase 的基本 API,包括增、删、改、查等。
增、删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。
HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,
基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络传输的压力。
使用过滤器至少需要两类参数:
一类是抽象的操作符,另一类是比较器
- 作用
过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端
- 种类
过滤器的类型很多,但是可以分为三大类:
比较过滤器:可应用于rowkey、列簇、列、列值过滤器
专用过滤器:只能适用于特定的过滤器
包装过滤器:包装过滤器就是通过包装其他过滤器以实现某些拓展的功能。
- 比较过滤器
所有比较过滤器均继承自
CompareFilter
。创建一个比较过滤器需要两个参数,分别是比较运算符和比较器实例。
- 比较运算符
LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
NO_OP 排除所有
- 常见的六大比较器
- 1、BinaryComparator
等值比较器
- 2、BinaryPrefixComparator
前缀比较器,只是比较左端前缀的数据是否相同
- 3、NullComparator
判断给定的是否为空
- 4、BitComparator
按位比较
- 5、RegexStringComparator
提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
- 6、SubstringComparator
包含比较器,判断提供的子串是否出现在中
一、RowFilter 行键过滤器
需求:通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
import com.wll.utils.HbaseTool;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.BinaryComparator;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.util.Bytes;public class HbaseBiJiaoFilter {public static void main(String[] args) throws Exception{//通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来xuQiu1();}public static void xuQiu1() throws Exception{//通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来//获取表对象Table students = HbaseTool.getOneTable("students");//全表查询Scan scan = new Scan();//创建等值比较器BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("1500100010"));//创建行键过滤器//public RowFilter(final CompareOperator op,final ByteArrayComparable rowComparator)RowFilter rowFilter = new RowFilter(CompareOperator.LESS, binaryComparator);//设置过滤器scan.setFilter(rowFilter);ResultScanner scanner = students.getScanner(scan);for (Result result : scanner) {HbaseTool.printResult(result);}HbaseTool.close();}
}
二、列簇过滤器:FamilyFilter
需求:通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据
public static void xuQiu2() throws Exception{//通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据//获取表对象Table students = HbaseTool.getOneTable("students");//全表查询Scan scan = new Scan();//创建包含比较器SubstringComparator in = new SubstringComparator("in");//创建列簇过滤器FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL, in);//设置过滤器scan.setFilter(familyFilter);ResultScanner scanner = students.getScanner(scan);for (Result result : scanner) {HbaseTool.printResult(result);}HbaseTool.close();}
三、列名过滤器:QualifierFilter
需求:通过QualifierFilter与SubstringComparator查询列名包含na的列的值
public static void xuQiu3() throws Exception{
// 通过QualifierFilter与SubstringComparator查询列名包含na的列的值//获取表对象Table students = HbaseTool.getOneTable("students");//全表查询Scan scan = new Scan();//创建包含比较器SubstringComparator in = new SubstringComparator("na");//创建列名过滤器QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, in);//设置过滤器scan.setFilter(qualifierFilter);ResultScanner scanner = students.getScanner(scan);for (Result result : scanner) {HbaseTool.printResult(result);}HbaseTool.close();}
四、列值过滤器:ValueFilter
需求:通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
只会查询出列值是张前缀的这一列,其他列不查
public static void xuQiu4() throws Exception{
// 通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生//获取表对象Table students = HbaseTool.getOneTable("students");//全表查询Scan scan = new Scan();//创建前缀比较器BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));//创建列值过滤器ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);//设置过滤器scan.setFilter(valueFilter);ResultScanner scanner = students.getScanner(scan);for (Result result : scanner) {HbaseTool.printResult(result);}HbaseTool.close();}
五、组合过滤器
需求:查询列名叫name且,列值以'张'开头的
public static void xuQiu5() throws Exception{//查询列名叫name且,列值以'张'开头的//获取表对象Table students = HbaseTool.getOneTable("students");//全表查询Scan scan = new Scan();//创建等值比较器BinaryComparator binaryComparator = new BinaryComparator(Bytes.toBytes("name"));//创建前缀比较器BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator(Bytes.toBytes("张"));//创建列名过滤器QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL, binaryComparator);//创建列值过滤器ValueFilter valueFilter = new ValueFilter(CompareOperator.EQUAL, binaryPrefixComparator);//创建过滤器集合FilterList filterList = new FilterList();//添加过滤器到过滤器集合中filterList.addFilter(qualifierFilter);filterList.addFilter(valueFilter);//设置过滤器scan.setFilter(filterList);ResultScanner scanner = students.getScanner(scan);for (Result result : scanner) {HbaseTool.printResult(result);}HbaseTool.close();}