博文作者:那伊抹微笑
itdog8 地址链接 : http://www.itdog8.com/thread-214-1-1.html

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

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

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

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

qq交流群:214293307  

idkey=bf80524ac3630cb0951006dfcd8888187bdc020161d1586bb207d85577577a71" style="color:rgb(51,102,153); text-decoration:none">(期待与你一起学习,共同进步)



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 集群)
写自己定义过滤器的时候须要熟悉过滤器的运行流程,不解释 、、、


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

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

    博文作者:那伊抹微笑 csdn 博客地址:http://blog.csdn.net/u012185296 itdog8 地址链接 : http://www.itdog8.com/thread-215- ...

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

    1 过滤器HBase 的基本 API,包括增.删.改.查等.增.删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询( ...

  3. Hbase Filter过滤器查询详解

    过滤器查询 引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器 过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端: hbase过滤器的比较运算符: LE ...

  4. HBase Filter 过滤器概述

    abc 过滤器介绍 HBase过滤器是一套为完成一些较高级的需求所提供的API接口. 过滤器也被称为下推判断器(push-down predicates),支持把数据过滤标准从客户端下推到服务器,带有 ...

  5. HBase之八--(3):Hbase 布隆过滤器BloomFilter介绍

    布隆过滤器( Bloom filters) 数据块索引提供了一个有效的方法,在访问一个特定的行时用来查找应该读取的HFile的数据块.但是它的效用是有限的.HFile数据块的默认大小是64KB,这个大 ...

  6. Hbase 布隆过滤器BloomFilter介绍

    转载自:http://blog.csdn.net/opensure/article/details/46453681 1.主要功能 提高随机读的性能 2.存储开销 bloom filter的数据存在S ...

  7. HBase Filter 过滤器之 Comparator 原理及源码学习

    前言:上篇文章HBase Filter 过滤器概述对HBase过滤器的组成及其家谱进行简单介绍,本篇文章主要对HBase过滤器之比较器作一个补充介绍,也算是HBase Filter学习的必备低阶魂技吧 ...

  8. JavaWeb(五)Filter过滤器

    Filter过滤器 Fileter介绍 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Serv ...

  9. Filter过滤器介绍

    简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...

随机推荐

  1. 并查集+背包 【CF741B】 Arpa's weak amphitheater and Mehrdad's valuable Hoses

    Descirption 有n个人,每个人都有颜值bi与体重wi.剧场的容量为W.有m条关系,xi与yi表示xi和yi是好朋友,在一个小组. 每个小组要么全部参加舞会,要么参加人数不能超过1人. 问保证 ...

  2. 洛谷——P1134 阶乘问题

    P1134 阶乘问题 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 ...

  3. Javascript 行为委托

    JavaScript 与C++,Java的面相对象编程的语言不同.就像不懂Linux人,会创造一个蹩脚的linux一样.一些JavaScript的编程总在尝试利用JavaScript 去模拟传统的面向 ...

  4. 洛谷 - Sdchr 的邀请赛 T4 信息传递

    (乱搞艹爆正解系列) 对不起,由于博主太弱了,并不会正解的多项式exp(甚至多项式exp我都不会2333). 只能来说一说我是怎么乱搞的啦QWQ 首先这个题最关键的性质是: 一个在原置换 g 中长度为 ...

  5. Postman Json测试接口

    当传递Json数据时: 1.必须添加http头:content-type:application/json,否则会报错(后台取不到相对应的值) 注意:如果服务端只支持UTF-8,但程序未对提交数据进行 ...

  6. 调用上一个页面的js方法

    点击商品分类,弹出下框 点击确定,将选中的类别的name和唯一的code返回到上个页面 function save(){ var ids = getIdSelections(); jp.get(&qu ...

  7. Android Studio 生成aar包多Module引用问题

    问题描述: 有个arr文件被放到Module A中引用,现在Module B又依赖了Module A,则在编译过程中会发生错误,Module B找不到aar文件. 解决办法: 使用相对路径来找到这个a ...

  8. 在MEF中手动导入依赖的模块

    对于简单的场景来讲,在MEF中导入依赖模块非常简单,只要用ImportAttribute标记依赖的成员,MEF模块会自动找到并创建该模块.但有的时候我们依赖的模块是上下文相关的,此时MEF框架的自动组 ...

  9. 关于ComboGrid取值为非下拉框数据是,隐藏面板数据清空

    $('#areaGuid').combogrid({ panelWidth: 300, idField: 'guid', textField: 'name', mode: 'remote', meth ...

  10. OpenWrt 路由器过滤广告的N种方法

    路由器已经成为每个家庭不可缺少的角色,手机.电脑.电视,凡是需要互联网的设备都要用到它.那么路由器除了给我们的网络设备分发网络外,还有其他用途吗? 现在很多人家里都用着智能路由器,智能路由器究竟怎么智 ...