Hbase过滤器简介
HBase的基本API,包括增、删、改、查等,增、删都是相对简单的操作,与传统的RDBMS相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。 HBase不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。通过这些过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上(由行键,列明,时间戳定位)。
HBase过滤器的类型很多,但是可以分为两大类:比较过滤器,专用过滤器。
1. 比较过滤器 - 通用比较器
比较器作为过滤器的核心组成之一,用于处理具体的比较逻辑,例如字节级的比较,字符串级的比较等。
- BinaryComparator
二进制比较器,用于按字典顺序比较 Byte 数据值
- BinaryPrefixComparator
前缀二进制比较器,按前缀比较
- NullComparator
判断给定的是否为空
- BitComparator
按位比较
- RegexStringComparator
支持正则表达式的值比较,仅支持 EQUAL 和非EQUAL
- SubstringComparator
判断提供的子串是否出现在value中,不区分大小写
2. 比较过滤器 - 通用操作符
HBase提供了枚举类型的变量来表示我们常用的抽象操作符。
- LESS <
- LESS_OR_EQUAL <=
- EQUAL =
- NOT_EQUAL <>
- GREATER_OR_EQUAL >=
- GREATER >
- NO_OP 排除所有
3.比较过滤器 - 行健过滤器
- RowFilter 筛选出行健匹配的所有的行
- 语法 RowFilter(操作符,比较器)
- 性能 一般来讲,执行 Scan 使用 startRow/stopRow 方式比较好
- 示例代码
new RowFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(
Bytes.toBytes("testRowkey1")))
筛选出行健等于testRowkey1的行
new RowFilter(
CompareFilter.CompareOp.LESS_OR_EQUAL,
new BinaryComparator(
Bytes.toBytes("testRowkey20")))
筛选出行健小于等于testRowkey20的行
- 调用示例
Connection connection = ConnectionFactory.createConnection(
ConfigFactory.getInstance().getHbaseConf());
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes(rowkey)));
scan.setFilter(filter);
ResultScanner results = table.getScanner(scan);
4.比较过滤器 - 列簇过滤器
- FamilyFilter 筛选出列簇匹配的数据 返回数据的单位是Cell,而不是整行数据
- 语法 FamilyFilter(操作符,比较器)
- 性能 通常在 Scan 过程中通过设定某些列族来实现该功能,而不是直接使用该过滤器
- 示例代码
new FamilyFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(
Bytes.toBytes("family1")))
筛选出列簇等于family1的cell
new FamilyFilter(CompareFilter.CompareOp.LESS,
new BinaryComparator(Bytes.toBytes("family20")))
筛选出列簇小于family20的cell
5.比较过滤器 - 子列过滤器
- QualifierFilter 筛选出子列匹配的数据 返回数据的单位是Cell,而不是整行数据
- 语法 QualifierFilter(操作符,比较器)
- 示例代码
new QualifierFilter(CompareOp.EQUAL, new RegexStringComparator("you."));
筛选出子列以you开头,不止是you,以及空的cell
new QualifierFilter(CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("column1")))
筛选出子列不等于column1的cell
6.比较过滤器 - 子列范围过滤器
- ColumnRangeFilter 该过滤器用于获取一个指定子列范围内的所有Cell。
- 语法 ColumnRangeFilter(子列起始值、是否包含起始值,子列结束值,是否包含结束值)
- 性能 该过滤器可以进行高效的子列内部扫描(因为子列是已经按字典排序好的),HBase-0.9.2 版本引入该功能。
- 示例代码
new ColumnRangeFilter(
Bytes.toBytes("column1"), true,
Bytes.toBytes("column10"), true)
筛选出子列大于等于column1,小于等于column10的 所有cell
7.比较过滤器 -列值过滤器
- ValueFilter 筛选出列值匹配的数据 返回数据的单位是Cell,而不是整行数据
- 语法 ValueFilter(操作符,比较器)
- 示例代码
new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("value"))
筛选出所有列值中包含value的cell
8.专用过滤器 - 行健前缀过滤器
- PrefixFilter 筛选出行健前缀匹配的所有的行
- 语法 PrefixFilter(行健前缀)
- 示例代码
new PrefixFilter(Bytes.toBytes("testRowkey"))
筛选出行健前缀等于testRowkey的所有行
9.专用过滤器 - 子列前缀过滤器
- ColumnPrefixFilter 筛选出包含前缀的所有子列 返回数据的单位是Cell,而不是整行数据一般来讲
- 语法 ColumnPrefixFilter(前缀)
- 示例代码
new ColumnPrefixFilter(Bytes.toBytes("column"))
筛选出所有以column开头子列的cellnew ColumnPrefixFilter(Bytes.toBytes("column"))
筛选出所有以column开头子列的cell
10.专用过滤器 - 多子列前缀过滤器
- MultipleColumnPrefixFilter MultipleColumnPrefixFilter 与 ColumnPrefixFilter 的行为类似,但可以指定多个子列前缀
- 语法 MultipleColumnPrefixFilter(前缀byte二维数组)
- 示例代码
byte[][] prefixes = new byte[][]{Bytes.toBytes("column 1"), Bytes.toBytes("column2")}
new MultipleColumnPrefixFilter (prefixes)
筛选出所有以column1和column2开头子列的cell
11.专用过滤器 - 列综合过滤器
- DependentColumnFilter 该过滤器尝试找到该列簇、子列所在的Cell。
- 语法 DependentColumnFilter(列簇、子列)
- 示例代码
new DependentColumnFilter(
Bytes.toBytes("family1"), Bytes.toBytes("column1"))
筛选出所有列簇family1、子列column1的所有Cell
12.专用过滤器 - 结构过滤器
- FilterList 该过滤器代表一个过滤器链 ,它可以包含一组即将应用于目标数据集的过滤器,过滤器间具有“与”和“或”关系。
- 语法
FilterList(列关系、过滤器集合)
FilterList.Operator.MUST_PASS_ ALL 关系与
FilterList.Operator.MUST_PASS_ ONE 关系或
- 示例代码
Connection connection = ConnectionFactory.createConnection(
ConfigFactory.getInstance().getHbaseConf());
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
Filter filter1 = new RowFilter(CompareFilter.CompareOp.EQUAL,
new BinaryComparator(Bytes.toBytes(rowkey)));
Filter filter2 = new DependentColumnFilter(
Bytes.toBytes(“family1”), Bytes.toBytes(“column1”));
List<Filter> filters = new ArrayList<>();
filters.add(filter1);
filters.add(filter2);
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);
scan.setFilter(filterList);
ResultScanner results = table.getScanner(scan);