Hbase过滤器详解
This commit is contained in:
parent
b37a5665cb
commit
205bdddb0e
@ -28,7 +28,7 @@
|
||||
|
||||
## 一、HBase过滤器简介
|
||||
|
||||
Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predicate push down)。这样可以保证过滤掉的数据不会被传送到客户端,减轻网络传输和客户端处理的压力。
|
||||
Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predicate push down)。这样可以保证过滤掉的数据不会被传送到客户端,从而减轻网络传输和客户端处理的压力。
|
||||
|
||||
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-fliter.png"/> </div>
|
||||
|
||||
@ -110,30 +110,27 @@ public enum CompareOperator {
|
||||
}
|
||||
```
|
||||
|
||||
> 注意:在1.x 版本的HBase中比较运算符定义在`CompareFilter.CompareOp`枚举类中,但在2.0之后这个类就被标识为 @deprecated ,并会在3.0移除。
|
||||
> 注意:在 1.x 版本的HBase中,比较运算符定义在`CompareFilter.CompareOp`枚举类中,但在2.0之后这个类就被标识为 @deprecated ,并会在3.0移除。所以2.0之后版本的HBase需要使用 `CompareOperator`这个枚举类。
|
||||
>
|
||||
> 所以1.x 版本的比较运算符需要使用`CompareFilter.CompareOp`枚举类, 2.0 版本HBase 则需要使用 `CompareOperator`枚举类。
|
||||
|
||||
### 3.2 比较器
|
||||
|
||||
所有比较器均继承自`ByteArrayComparable`抽象类
|
||||
所有比较器均继承自`ByteArrayComparable`抽象类,常用的有以下几种:
|
||||
|
||||
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-bytearraycomparable.png"/> </div>
|
||||
|
||||
常用的有以下几种:
|
||||
- **BinaryComparator** : 使用`Bytes.compareTo(byte [],byte [])`按字典序比较指定的字节数组。
|
||||
- **BinaryPrefixComparator** : 按字典序与指定的字节数组进行比较,但只比较到这个字节数组的长度。
|
||||
- **RegexStringComparator** : 使用给定的正则表达式与指定的字节数组进行比较。仅支持`EQUAL`和`NOT_EQUAL`操作。
|
||||
- **SubStringComparator** : 测试给定的子字符串是否出现在指定的字节数组中,比较不区分大小写。仅支持`EQUAL`和`NOT_EQUAL`操作。
|
||||
- **NullComparator** :判断给定的值是否为空。
|
||||
- **BitComparator** :按位进行比较。
|
||||
|
||||
- BinaryComparator : 使用`Bytes.compareTo(byte [],byte [])`按字典序比较指定的字节数组
|
||||
- BinaryPrefixComparator : 按字典序与指定的字节数组进行比较,但只比较到这个字节数组的长度。
|
||||
- RegexStringComparator : 使用给定的正则表达式与指定的字节数组进行比较。仅支持 EQUAL 和 NOT_EQUAL 操作
|
||||
- SubStringComparator : 测试给定的子字符串是否出现在指定的字节数组中,比较不区分大小写。仅支持 EQUAL 和NOT_EQUAL 操作
|
||||
- NullComparator :判断给定的值是否为空
|
||||
- BitComparator :按位进行比较
|
||||
|
||||
BinaryPrefixComparator 和 BinaryComparator的区别不是很好表述,这里举例说明一下:
|
||||
`BinaryPrefixComparator` 和 `BinaryComparator`的区别不是很好理解,这里举例说明一下:
|
||||
|
||||
在进行`EQUAL`的比较时,如果比较器传入的是`abcd`的字节数组,但是待比较数据是`abcdefgh`:
|
||||
|
||||
+ 如果使用的是`BinaryPrefixComparator `比较器,则比较以`abcd`字节数组的长度为准,即`efgh`不会参与比较,这时候认为`abcd`与`abcdefgh` 是满足`EQUAL`条件的;
|
||||
+ 如果使用的是`BinaryPrefixComparator`比较器,则比较以`abcd`字节数组的长度为准,即`efgh`不会参与比较,这时候认为`abcd`与`abcdefgh` 是满足`EQUAL`条件的;
|
||||
+ 如果使用的是`BinaryComparator`比较器,则认为其是不相等的。
|
||||
|
||||
### 3.3 比较过滤器种类
|
||||
@ -142,11 +139,11 @@ BinaryPrefixComparator 和 BinaryComparator的区别不是很好表述,这里
|
||||
|
||||
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/hbase-compareFilter.png"/> </div>
|
||||
|
||||
+ RowFilter :基于行键来过滤数据;
|
||||
+ FamilyFilterr :基于列族来过滤数据;
|
||||
+ QualifierFilterr :基于列限定符(列名)来过滤数据;
|
||||
+ ValueFilterr :基于单元格(cell) 的值来过滤数据;
|
||||
+ DependentColumnFilter :指定一个参考列来过滤其他列的过滤器,过滤的原则是基于参考列的时间戳来进行筛选 。
|
||||
+ **RowFilter** :基于行键来过滤数据;
|
||||
+ **FamilyFilterr** :基于列族来过滤数据;
|
||||
+ **QualifierFilterr** :基于列限定符(列名)来过滤数据;
|
||||
+ **ValueFilterr** :基于单元格(cell) 的值来过滤数据;
|
||||
+ **DependentColumnFilter** :指定一个参考列来过滤其他列的过滤器,过滤的原则是基于参考列的时间戳来进行筛选 。
|
||||
|
||||
前四种过滤器的使用方法相同,均只要传递比较运算符和运算器实例即可构建,然后通过`setFilter`方法传递给`scan`:
|
||||
|
||||
@ -156,11 +153,11 @@ BinaryPrefixComparator 和 BinaryComparator的区别不是很好表述,这里
|
||||
scan.setFilter(filter);
|
||||
```
|
||||
|
||||
DependentColumnFilter 的使用稍微复杂一点,这里单独做如下说明。
|
||||
`DependentColumnFilter`的使用稍微复杂一点,这里单独做下说明。
|
||||
|
||||
### 3.4 DependentColumnFilter
|
||||
|
||||
可以把DependentColumnFilter理解为**一个valueFilter和一个时间戳过滤器的组合**。DependentColumnFilter 有三个带参构造器,这里选择一个参数最全的进行说明:
|
||||
可以把`DependentColumnFilter`理解为**一个valueFilter和一个时间戳过滤器的组合**。`DependentColumnFilter`有三个带参构造器,这里选择一个参数最全的进行说明:
|
||||
|
||||
```java
|
||||
DependentColumnFilter(final byte [] family, final byte[] qualifier,
|
||||
@ -168,11 +165,11 @@ DependentColumnFilter(final byte [] family, final byte[] qualifier,
|
||||
final ByteArrayComparable valueComparator)
|
||||
```
|
||||
|
||||
+ family :列族
|
||||
+ qualifier :列限定符(列名)
|
||||
+ dropDependentColumn :决定参考列是否被包含在返回结果内,为true时表示参考列被返回,为false时表示被丢弃
|
||||
+ op :比较运算符
|
||||
+ valueComparator :比较器
|
||||
+ **family** :列族
|
||||
+ **qualifier** :列限定符(列名)
|
||||
+ **dropDependentColumn** :决定参考列是否被包含在返回结果内,为true时表示参考列被返回,为false时表示被丢弃
|
||||
+ **op** :比较运算符
|
||||
+ **valueComparator** :比较器
|
||||
|
||||
这里举例进行说明:
|
||||
|
||||
@ -189,7 +186,7 @@ DependentColumnFilter dependentColumnFilter = new DependentColumnFilter(
|
||||
|
||||
+ 其次再用参考数据集中所有数据的时间戳去检索其他列,获得时间戳相同的其他列的数据作为`结果数据集`,这一步等同于时间戳过滤器;
|
||||
|
||||
+ 最后如果`dropDependentColumn `为true,则返回`参考数据集`+`结果数据集`,若为false,则抛弃参考数据集,只返回结果数据集。
|
||||
+ 最后如果`dropDependentColumn`为true,则返回`参考数据集`+`结果数据集`,若为false,则抛弃参考数据集,只返回`结果数据集`。
|
||||
|
||||
|
||||
|
||||
@ -201,8 +198,8 @@ DependentColumnFilter dependentColumnFilter = new DependentColumnFilter(
|
||||
|
||||
基于某列(参考列)的值决定某行数据是否被过滤。其实例有以下方法:
|
||||
|
||||
+ setFilterIfMissing(boolean filterIfMissing) :默认值为false,即如果该行数据不包含参考列,其依然被包含在最后的结果中;设置为true时,则不包含;
|
||||
+ setLatestVersionOnly(boolean latestVersionOnly) :默认为true,即只检索参考列的最新版本数据;设置为false,则检索所有版本数据。
|
||||
+ **setFilterIfMissing(boolean filterIfMissing)** :默认值为false,即如果该行数据不包含参考列,其依然被包含在最后的结果中;设置为true时,则不包含;
|
||||
+ **setLatestVersionOnly(boolean latestVersionOnly)** :默认为true,即只检索参考列的最新版本数据;设置为false,则检索所有版本数据。
|
||||
|
||||
```shell
|
||||
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(
|
||||
@ -311,7 +308,7 @@ scan.setFilter(timestampsFilter);
|
||||
|
||||
### 4.7 首次行键过滤器 (FirstKeyOnlyFilter)
|
||||
|
||||
FirstKeyOnlyFilter只扫描每行的第一列,扫描完第一列后就结束对当前行的扫描,并跳转到下一行。相比于全表扫描,其性能更好,通常用于行数统计的场景,因为如果某一行存在,则行中必然至少有一列。
|
||||
`FirstKeyOnlyFilter`只扫描每行的第一列,扫描完第一列后就结束对当前行的扫描,并跳转到下一行。相比于全表扫描,其性能更好,通常用于行数统计的场景,因为如果某一行存在,则行中必然至少有一列。
|
||||
|
||||
```java
|
||||
FirstKeyOnlyFilter firstKeyOnlyFilter = new FirstKeyOnlyFilter();
|
||||
@ -324,7 +321,7 @@ scan.set(firstKeyOnlyFilter);
|
||||
|
||||
### 5.1 SkipFilter过滤器
|
||||
|
||||
SkipFilter包装一个过滤器,当被包装的过滤器遇到一个需要过滤的KeyValue实例时,则拓展过滤整行数据。下面是一个使用示例:
|
||||
`SkipFilter`包装一个过滤器,当被包装的过滤器遇到一个需要过滤的KeyValue实例时,则拓展过滤整行数据。下面是一个使用示例:
|
||||
|
||||
```java
|
||||
// 定义ValueFilter过滤器
|
||||
@ -338,7 +335,7 @@ Filter filter2 = new SkipFilter(filter1);
|
||||
|
||||
### 5.2 WhileMatchFilter过滤器
|
||||
|
||||
WhileMatchFilter包装一个过滤器,当被包装的过滤器遇到一个需要过滤的KeyValue实例时,WhileMatchFilter则结束本次扫描,返回已经扫描到的结果。下面是其使用示例:
|
||||
`WhileMatchFilter`包装一个过滤器,当被包装的过滤器遇到一个需要过滤的KeyValue实例时,`WhileMatchFilter`则结束本次扫描,返回已经扫描到的结果。下面是其使用示例:
|
||||
|
||||
```java
|
||||
Filter filter1 = new RowFilter(CompareOperator.NOT_EQUAL,
|
||||
@ -390,7 +387,7 @@ rowKey3/student:name/1555035007037/Put/vlen=8/seqid=0
|
||||
|
||||
## 六、FilterList
|
||||
|
||||
以上都是讲解单个过滤器的作用,当需要多个过滤器共同作用于一次查询的时候,就需要使用FilterList。FilterList支持通过构造器或者`addFilter`方法传入多个过滤器。
|
||||
以上都是讲解单个过滤器的作用,当需要多个过滤器共同作用于一次查询的时候,就需要使用`FilterList`。`FilterList`支持通过构造器或者`addFilter`方法传入多个过滤器。
|
||||
|
||||
```java
|
||||
// 构造器传入
|
||||
@ -405,8 +402,8 @@ public FilterList(final Filter... filters)
|
||||
|
||||
多个过滤器组合的结果由`operator`参数定义 ,其可选参数定义在`Operator`枚举类中。只有`MUST_PASS_ALL`和`MUST_PASS_ONE`两个可选的值:
|
||||
|
||||
+ MUST_PASS_ALL :相当于AND,必须所有的过滤器都通过才认为通过;
|
||||
+ MUST_PASS_ONE :相当于OR,只有要一个过滤器通过则认为通过。
|
||||
+ **MUST_PASS_ALL** :相当于AND,必须所有的过滤器都通过才认为通过;
|
||||
+ **MUST_PASS_ONE** :相当于OR,只有要一个过滤器通过则认为通过。
|
||||
|
||||
```java
|
||||
@InterfaceAudience.Public
|
||||
|
Loading…
x
Reference in New Issue
Block a user