Hbase中的过滤器_比较过滤器
- 概念
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();
}