HBase - Filter - 过滤器的介绍以及使用 | 那伊抹微笑

博文作者:那伊抹微笑

csdn 博客地址:http://blog.csdn.net/u012185296

itdog8 地址链接 : http://www.itdog8.com/thread-214-1-1.html

博文标题:HBase - Filter - 过滤器的介绍以及使用 | 那伊抹微笑

个性签名:世界上最遥远的距离不是天涯。也不是海角。而是我站在妳的面前。妳却感觉不到我的存在

技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spark ... 云计算技术

转载声明:能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!

qq交流群:214293307  (期待与你一起学习,共同进步)

1 过滤器

HBase 的基本 API,包含增、删、改、查等。

增、删都是相对简单的操作。与传统的 RDBMS 相比。这里的查询操作略显苍白,仅仅能依据特性的行键进行查询(Get)或者依据行键的范围来查询(Scan)。

HBase 不仅提供了这些简单的查询,并且提供了更加高级的过滤器(Filter)来查询。

1.1 过滤器的两类參数

过滤器能够依据列族、列、版本号等很多其它的条件来对数据进行过滤。基于 HBase 本身提供的三维有序(行键,列。版本号有序)。这些过滤器能够高效地完毕查询过滤的任务,带有过滤器条件的 RPC 查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也能够减少网络传输的压力。

使用过滤器至少须要两类參数:

1.1.1 一类是抽象的操作符

HBase 提供了枚举类型的变量来表示这些抽象的操作符:

LESS

LESS_OR_EQUAL

EQUAL

NOT_EQUAL

GREATER_OR_EQUAL

GREATER

NO_OP

1.1.2 还有一类是比較器

代表详细的逻辑,比如字节级的比較。字符串级的比較等。

1.2 比較器

比較器作为过滤器的核心组成之中的一个。用于处理详细的比較逻辑,比如字节级的比較,字符串级的比較等。

1.2.1 RegexStringComparator

支持正則表達式的值比較

Scan scan = new Scan();

RegexStringComparator comp = new RegexStringComparator("you."); // 以 you 开头的字符串

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), CompareOp.EQUAL, comp);

scan.setFilter(filter);

1.2.2 SubStringComparator

用于监測一个子串是否存在于值中,而且不区分大写和小写。

Scan scan = new Scan();

SubstringComparator comp = new SubstringComparator("1129"); // 查找包括 1129 的字符串

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), CompareOp.EQUAL, comp);

scan.setFilter(filter);

1.2.3 BinaryPrefixComparator

前缀二进制比較器。

与二进制比較器不同的是,仅仅比較前缀是否同样。

Scan scan = new Scan();

BinaryPrefixComparator comp = new BinaryPrefixComparator(Bytes.toBytes("yting")); //

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"),  CompareOp.EQUAL, comp);

scan.setFilter(filter);

1.2.4 BinaryComparator

二进制比較器,用于按字典顺序比較 Byte 数据值。

Scan scan = new Scan();

BinaryComparator comp = new BinaryComparator(Bytes.toBytes("xmei")); //

ValueFilter filter = new ValueFilter(CompareOp.EQUAL, comp);

scan.setFilter(filter);

1.3 列值过滤器

1.3.1 SingleColumnValueFilter

SingleColumnValueFilter
用于測试值的情况(相等,不等,范围 、、、)

以下一个检測列族 family 下的列 qualifier 的列值和字符串 "my-value" 相等的部分演示样例代码 :

Scan scan = new Scan();

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), CompareOp.EQUAL, Bytes.toBytes("my-value"));

scan.setFilter(filter);

1.3.2 SingleColumnValueExcludeFilter

跟 SingleColumnValueFilter 功能一样,仅仅是不查询出该列的值。

以下的代码就不会查询出 family 列族下 qualifier 列的值(列都不会查出来)

Scan scan = new Scan();

SingleColumnValueExcludeFilter filter = new SingleColumnValueExcludeFilter(Bytes.toBytes("family"),
Bytes.toBytes("qualifier"), CompareOp.EQUAL, Bytes.toBytes("my-value"));

scan.setFilter(filter);

1.4 键值元数据过滤器

HBase 採用 "键值对" 保存内部数据,键值元数据过滤器评估一行的 "键" 是否保存在(如 ColumnFamily:Column qualifiers)。

1.4.1 FamilyFilter

用于过滤列族(通常在 Scan 过程中通过设定某些列族来实现该功能,而不是直接使用该过滤器)。

Scan scan = new Scan();

FamilyFilter filter = new FamilyFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("my-family"))); // 列族为 my-family

scan.setFilter(filter);

1.4.2 QualifierFilter

用于列名(Qualifier)过滤。

Scan scan = new Scan();

QualifierFilter filter = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("my-column"))); // 列名为 my-column

scan.setFilter(filter);

1.4.3 ColumnPrefixFilter

用于列名(Qualifier)前缀过滤,即包括某个前缀的全部列名。

Scan scan = new Scan();

ColumnPrefixFilter filter = new ColumnPrefixFilter(Bytes.toBytes("my-prefix")); // 前缀为 my-prefix

scan.setFilter(filter);

1.4.4 MultipleColumnPrefixFilter

MultipleColumnPrefixFilter 与 ColumnPrefixFilter  的行为类似,但能够指定多个列名(Qualifier)前缀。

Scan scan = new Scan();

byte[][] prefixes = new byte[][]{Bytes.toBytes("my-prefix-1"), Bytes.toBytes("my-prefix-2")};

MultipleColumnPrefixFilter filter = new MultipleColumnPrefixFilter(prefixes); // 不解释,你懂的 、、、

scan.setFilter(filter);

1..4.5 ColumnRangeFilter

该过滤器能够进行高效的列名内部扫描。(为何是高效呢???由于列名是已经按字典排序好的)HBase-0.9.2 版本号引入该功能。

Scan scan = new Scan();

boolean minColumnInclusive = true;

boolean maxColumnInclusive = true;

ColumnRangeFilter filter = new ColumnRangeFilter(Bytes.toBytes("minColumn"), minColumnInclusive, Bytes.toBytes("maxColumn"), maxColumnInclusive);

scan.setFilter(filter);

1.6 DependentColumnFilter

该过滤器尝试找到该列所在的每一行,并返回该行具有同样时间戳的所有键值对。

Scan scan = new Scan();

DependentColumnFilter filter = new DependentColumnFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"));

scan.setFilter(filter);

1.5 行键过滤器

1.5.1 RowFilter

行键过滤器,一般来讲,运行 Scan 使用 startRow/stopRow 方式比較好,而 RowFilter 过滤器也能够完毕对某一行的过滤。

Scan scan = new Scan();

RowFilter filter = new RowFilter(CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("my-row-1")));

scan.setFilter(filter);

1.5.2 RandomRowFilter

该过滤器是随机选择一行的过滤器。參数 chance 是一个浮点值。介于 0.1 和 1.0 之间。

Scan scan = new Scan();

float chance = 0.5f;

RandomRowFilter filter = new RandomRowFilter(chance); // change 在 0.1 ~ 1.0 之间的浮点值

scan.setFilter(filter);

1.6 功能过滤器

1.6.1 PageFilter

用于按行分页。

long pageSize = 10;

int totalRowsCount = 0;

PageFilter filter = new PageFilter(pageSize);

byte[] lastRow = null;

while(true) {

Scan scan = new Scan();

scan.setFilter(filter);

if(lastRow != null) {

byte[] postfix = Bytes.toBytes("postfix");

byte[] startRow = Bytes.add(lastRow, postfix);

scan.setStartRow(startRow);

System.out.println("start row : " + Bytes.toString(startRow));

}

ResultScanner scanner = _hTable.getScanner(scan);

int localRowsCount = 0;

for(Result result : scanner) {

System.out.println(localRowsCount++ + " : " + result);

totalRowsCount++;

lastRow = result.getRow(); // ResultScanner 的结果集是排序好的,这样就能够取到最后一个 row 了

}

scanner.close();

if(localRowsCount == 0) break;

}

System.out.println("total rows is : " + totalRowsCount);

1.6.2 FirstKeyOnlyFilter

该过滤器仅仅查询每一个行键的第一个键值对。在统计计数的时候提高效率。(HBase-Coprocessor 做 RowCount 的时候能够提高效率)。

Scan scan = new Scan();

FirstKeyOnlyFilter filter = new FirstKeyOnlyFilter(); // 仅仅查询每一个行键的第一个键值对

scan.setFilter(filter);

1.6.3 KeyOnlyFilter

Scan scan = new Scan();

KeyOnlyFilter filter = new KeyOnlyFilter(); // 仅仅查询每行键值对中有 "键" 元数据信息,不显示值。能够提升扫描的效率

scan.setFilter(filter);

1.6.4 InclusiveStopFilter

常规的 Scan 包括 start-row 但不包括 stop-row。假设使用该过滤器便能够包括 stop-row。

Scan scan = new Scan();

InclusiveStopFilter filter = new InclusiveStopFilter(Bytes.toBytes("stopRowKey"));

scan.setFilter(filter);

1.6.5 ColumnPaginationFilter

按列分页过滤器,针对列数量非常多的情况使用。

Scan scan = new Scan();

int limit = 0;

int columnOffset = 0;

ColumnPaginationFilter filter = new ColumnPaginationFilter(limit, columnOffset);

scan.setFilter(filter);

2 自己定义过滤器

做法 : 继承 FilterBase,然后打成 jar 放到 $HBASE_HOEM/lib 文件夹下去(注意:须要重新启动 HBase 集群)

写自己定义过滤器的时候须要熟悉过滤器的运行流程,不解释 、、、

时间: 2024-10-18 22:25:14

HBase - Filter - 过滤器的介绍以及使用 | 那伊抹微笑的相关文章

HBase - 计数器 - 计数器的介绍以及使用 | 那伊抹微笑

博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 itdog8 地址链接 : http://www.itdog8.com/thread-215-1-1.html 博文标题:HBase - 计数器 - 计数器的介绍以及使用 | 那伊抹微笑 个性签名:世界上最遥远的距离不是天涯.也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+Mahout+Spa

HBase - Coprocessor - 协处理器之观察者Observer(触发器)的介绍以及使用 | 那伊抹微笑

博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 itdog8 地址链接 : http://www.itdog8.com/thread-216-1-1.html 博文标题:HBase - Coprocessor - 协处理器之观察者Observer(触发器)的介绍以及使用 | 那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hb

HBase - Filter - 过滤器的介绍以及使用

1 过滤器HBase 的基本 API,包括增.删.改.查等.增.删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan).HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询. 1.1 过滤器的两类参数过滤器可以根据列族.列.版本等更多的条件来对数据进行过滤,基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的

HBase - MapReduce - 使用 MapReduce 批量操作 HBase 介绍 | 那伊抹微笑

博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 itdog8 地址链接 : http://www.itdog8.com/thread-202-1-1.html 博文标题:HBase - MapReduce - 使用 MapReduce 批量操作 HBase 介绍 | 那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+

HBase - MapReduce - HBase 作为输入源的示例 | 那伊抹微笑

博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 itdog8 地址链接 : http://www.itdog8.com/thread-203-1-1.html 博文标题:HBase - MapReduce - HBase 作为输入源的示例 | 那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+

HBase - MapReduce - HBase 作为输出源的示例 | 那伊抹微笑

博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 itdog8 地址链接 : http://www.itdog8.com/thread-204-1-1.html 博文标题:HBase - MapReduce - HBase 作为输出源的示例 | 那伊抹微笑 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前,妳却感觉不到我的存在 技术方向:Flume+Kafka+Storm+Redis/Hbase+Hadoop+Hive+

Hbase Filter过滤器查询详解

过滤器查询 引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: hbase过滤器的比较运算符: LESS  < LESS_OR_EQUAL <= EQUAL = NOT_EQUAL <> GREATER_OR_EQUAL >= GREATER > NO_OP 排除所有 Hbase过滤器的比较器(指定比较机制): BinaryComparator  按字节索引顺序比较指定字

Hbase 布隆过滤器BloomFilter介绍

1.主要功能 提高随机读的性能 2.存储开销 bloom filter的数据存在StoreFile的meta中,一旦写入无法更新,由于StoreFile是不可变的.Bloomfilter是一个列族(cf)级别的配置属性,假设你在表中设置了Bloomfilter,那么HBase会在生成StoreFile时包括一份bloomfilter结构的数据,称其为MetaBlock:MetaBlock与DataBlock(真实的KeyValue数据)一起由LRUBlockCache维护.所以,开启bloomf

一个自定义 HBase Filter -“通过RowKeys来高性能获取数据”

大家在使用HBase和Solr搭建系统中经常遇到的一个问题就是:“我通过SOLR得到了RowKeys后,该怎样去HBase上取数据”.使用现有的Filter性能差劲,网上也没有现成的解决方案,我在这里把这个问题的解决办法分享给大家,抛砖引玉一下. Solr和HBase专辑 1.“关于Solr的使用总结的心得体会”(http://www.cnblogs.com/wgp13x/p/3742653.html) 2.“中文分词器性能比较?”(http://www.cnblogs.com/wgp13x/p