HBase 的基本 API,包括增、删、改、查等。 增、删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询(Scan)。 HBase 不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询。作用
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤,
基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤器条件的 RPC (远程服务)查询请求会把过滤器分发到各个 RegionServer(这是一个服务端过滤器),这样也可以降低网络传输的压力。
使用过滤器至少需要两类参数:
一类是抽象的操作符,另一类是比较器
所有比较过滤器均继承自 CompareFilter。创建一个比较过滤器需要两个参数,分别是比较运算符和比较器实例。
按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])BinaryPrefixComparator(前缀比较器)
通BinaryComparator,只是比较左端前缀的数据是否相同NullComparator
判断给定的是否为空BitComparator
按位比较RegexStringComparator
提供一个正则的比较器,仅支持 EQUAL 和非EQUALSubstringComparator
判断提供的子串是否出现在中代码演示
通过RowFilter与BinaryComparator过滤比rowKey 1500100010小的所有值出来
通过FamilyFilter与SubstringComparator查询列簇名包含in的所有列簇下面的数据
通过FamilyFilter与 BinaryPrefixComparator 过滤出列簇以i开头的列簇下的所有数据
通过QualifierFilter与SubstringComparator查询列名包含ge的列的值
过滤出列的名字中 包含 "am" 所有的列 及列的值
通过ValueFilter与BinaryPrefixComparator过滤出所有的cell中值以 "张" 开头的学生
过滤出文科的学生,只会返回以文科开头的数据列,其他列的数据不符合条件,不会返回
SingleColumnValueFilter会返回满足条件的cell所在行的所有cell的值(即会返回一行数据)
通过SingleColumnValueFilter与查询文科班所有学生信息
与SingleColumnValueFilter相反,会排除掉指定的列,其他的列全部返回
通过SingleColumnValueExcludeFilter与BinaryComparator查询文科一班所有学生信息,最终不返回clazz列
通过PrefixFilter查询以150010008开头的所有前缀的rowkey
通过PageFilter查询三页的数据,每页10条
使用PageFilter分页效率比较低,每次都需要扫描前面的数据,直到扫描到所需要查的数据
可设计一个合理的rowkey来实现分页需求
需要注意的是在多台 Regin Services 上执行分页过滤的时候,由于并行执行的过滤器不能共享它们的状态和边界,所以有可能每个过滤器都会在完成扫描前获取了 PageCount 行的结果,这种情况下会返回比分页条数更多的数据,分页过滤器就有失效的可能。[code] /** * 分页过滤器 * 通过PageFilter查询三页的数据,每页10条 */ @Test public void PageFilter() { try { //获取表的实例 HTableInterface students = conn.getTable("students"); //定义要查询的页数 int pageNum = 3; //定义每页的条数 int pageSize = 10; Scan scan = new Scan(); //定义一开始的行 String current_page_start_row = ""; for (int i = 1; i
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |