Hbase 过滤器

简介:

HBase的基本API,包括增删改查等,增和删是相对简单的操作,与传统的RDBMS相比较,这里的查询操作略显苍白,只能根据特性的行键进行查询(get) 或者根据行键的范围来查询(Scan).
HBase不仅提供了这些简单的查询,而且提供了更加高级的过滤器(Filter)来查询.
通过这些过滤器可以在HBase中的数据的多个维度(行,列,数据版本)上进行对数据的筛选操作,也就是说过滤器最终能够筛选数据能够细化到具体的存储单元格上(由行键,列簇,时间戳定位).
HBase过滤器的类型很多,但是可以分为两大类:比较过滤器,专用过滤器.

比较过滤器 通用比较器1

比较器作为过滤气的核心组成之一,用于处理具体的比较逻辑,列入字节级的比较,字符串的比较等.
BinaryComparator
二级制比较器,用于按字典顺序比较Byte数据值
BinaryPrefixComparator
前缀二进制比较器 按前缀比较
NullComparator
判断给定的是否为空
BitComparator
按位比较
RegexStringComparator
支持正则表达式的值比较,仅支持EQUAL和非EQUAL
SubStringComparator
判断提供的子串是否出现在value中 不区分大小写

比较过滤器,通用操作符
LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL<>
GREATER_OR_EQUAL>=
GREATER >
NO_OP 排除所有


比较过滤器 行键过滤器
RowFilter
删除行键匹配的所有的行
语法
RowFilter(操作符,比较器)
性能
一般来讲,执行Scan使用startRow/stopRow方式比较好

FamilyFilter
筛选出列簇匹配的数据
返回数据的单位是Cell 而不是整行数据
语法
familyFilter(操作符,比较)
性能
通常在Scan过程中通过设定某列列簇来实现该功能而不是直接使用该过滤器

QualifierFilter
筛选子列匹配的数据
返回数据的单位是Cell而不是整形数据
语法
QualifierFilter(操作符,比较器)


public class HbaseScanTest {
//创建配置链接
    private Configuration configuration = HBaseConfiguration.create();
    private Connection connection;
//声明表
    private Table bd17Test;
//在方法的构造体中 初始化数据 链接hbase和链接到table的表上
    public HbaseScanTest() throws IOException {

        connection = ConnectionFactory.createConnection(configuration);
        bd17Test = connection.getTable(TableName.valueOf("bd17:fromjava"));
    }

    // scan test 这个方法用于测试scan 和过滤的
    public void scanData() throws IOException {
        Scan scan = new Scan();
//resultScanner 的next方法返回查询结果集中的下一条数据 ,如果没有下一条数据
//则next返回结果是null
//输出条件从 row的rowKey_2开始到row为rowKey_5结束不包含rowKey_5
        scan.setStartRow(Bytes.toBytes("rowKey_2"));
        scan.setStopRow(Bytes.toBytes("rowKey_5"));
        
        ResultScanner rs = bd17Test.getScanner(scan);
        Result result = rs.next();
        while (result != null) {
            CellScanner cs =result.cellScanner();
            System.out.println("rowKey:"+Bytes.toString(result.getRow()));
        while(cs.advance()){
            Cell cell =cs.current();
            String family =Bytes.toString(CellUtil.cloneFamily(cell));
            String qualify =Bytes.toString(CellUtil.cloneQualifier(cell));
            String value =Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println("family"+family+"qualify"+qualify+"value"+value);
        }
            result = rs.next();
        }
    }
    public static void main(String[] args) throws IOException {
        HbaseScanTest hbaseScanTest =new HbaseScanTest();
        hbaseScanTest.scanData();
}    
}
public class HbaseScanTest {

    private Configuration configuration = HBaseConfiguration.create();

    private Connection connection;
    private Table bd17Test;

    public HbaseScanTest() throws IOException {

        connection = ConnectionFactory.createConnection(configuration);
        bd17Test = connection.getTable(TableName.valueOf("bd17:fromjava"));
    }
//rowfilter
    //获取rowkey中包含row的数据(这个方法被注释了)
    public void getByRowFilter() throws IOException{
    //首先构建sanner
        Scan scan =new Scan();
//        RowFilter rowFilter =new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("row"));
        //把过滤器加入到scan中
//        scan.setFilter(rowFilter);
        //把san加入到table上进行扫描获取resultscanner结果
//        ResultScanner rScanner =bd17Test.getScanner(scan);
//        ShowResult(rScanner);
        
        //获取rowkey<rowKey_5并且包含rowKey_5>
        RowFilter ltRowFilter =new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("rowKey_5")));
        scan.setFilter(ltRowFilter);
        ResultScanner rScanner =bd17Test.getScanner(scan);
        ShowResult(rScanner);
        
    }
    //输出的整个太过麻烦将其封装成方法而已
    public void ShowResult(ResultScanner rs) throws IOException{
        Result result = rs.next();
        while (result != null) {
            CellScanner cs =result.cellScanner();
            System.out.println("rowKey:"+Bytes.toString(result.getRow()));
        while(cs.advance()){
            Cell cell =cs.current();
            String family =Bytes.toString(CellUtil.cloneFamily(cell));
            String qualify =Bytes.toString(CellUtil.cloneQualifier(cell));
            String value =Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println("family:"+family+"  qualify:"+qualify+"  value:"+value);
        }
            result = rs.next();
        }
    }
    //familyfilter返回的是设置是列簇的数据
    public void getFamilyFilter() throws IOException{
        Filter famliyFilter = new FamilyFilter(CompareOp.EQUAL.LESS, new BinaryComparator(Bytes.toBytes("j")));
        Scan scan =new Scan();
        scan.setFilter(famliyFilter);
        ResultScanner rs= bd17Test.getScanner(scan);
        ShowResult(rs);
    }
    //getByQualifyFilter l列名称过滤器 只返回能批匹配的列名称的单元格数据
    public void getByQualifyFilter() throws IOException{
        org.apache.hadoop.hbase.filter.Filter qualifyFilter =new QualifierFilter(CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("tele")));
        Scan scan =new Scan();
        scan.setFilter(qualifyFilter);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);
    }
    public static void main(String[] args) throws IOException {
        HbaseScanTest hbaseScanTest =new HbaseScanTest();
//        hbaseScanTest.scanData();
        
        hbaseScanTest.getByRowFilter();
        hbaseScanTest.getFamilyFilter();
            hbaseScanTest.getByQualifyFilter();
}

比较过滤器 子列范围过滤器

CloumnRangeFilter
--该过滤器用获取一个指定子列范围内的所有Cell

语法

--columnRangeFilter(子列起始值,是否包含起始值,子列结束值,是否包含结束值)

性能
--该过滤器可以进行高效的子列内部扫描(因为子列是已经按字典排序好的)

public void getByClumnRangeFilter() throws IOException{
        Filter cRangeFilter =new ColumnRangeFilter(Bytes.toBytes("o_name1"), true, Bytes.toBytes("o_name2"),true);
        Scan scan =new Scan();
        scan.setFilter(cRangeFilter);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);        
    }

比较过滤器 列值过滤器

ValueFilter
--筛选出劣质匹配的数据
--返回数据的单位是Cell,而不是整行数据
语法
--ValueFilter(操作符,比较器)


    //按照姓名查找用户信息 只返回能匹配上的列值单元格的数据
    public void GetBySearchValue() throws IOException{
        Filter getBySearchValue =new ValueFilter(CompareOp.EQUAL, new RegexStringComparator("n_6"));
        
        Scan scan =new Scan();
        scan.setFilter(getBySearchValue);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);
        
    }

行健前缀过滤器

PreFixFilter
---筛选出行健前缀匹配的所有的行
语法
---PrefixFilter(行健前缀)

public void getPrefilter() throws IOException{
        Filter cPreFilter =new PrefixFilter(Bytes.toBytes("xisi"));
        Scan scan =new Scan();
        scan.setFilter(cPreFilter);
        ResultScanner rs =bd17Test.getScanner(scan);
        ShowResult(rs);
    
    }

专用过滤器 子列前缀过滤器
ColumnPrefixFilter
筛选出包含前缀的所有子列
返回数据的单位是Cell 而不是整行数据一般来讲
语法
ColumnPrefixFilter(前缀)
new ColumnPrefixFilter(Bytes.toBytes("cloumn"))

筛选所有以column开头子列cell

专用过滤器 多子列前缀过滤器器
MultpleColumnPrefixFilter
MultipleColumnPrefixFilter 与 ColumnPrefixFilter 的行为类似,但可以指定多个子列前缀
语法
MultipleColumnPrefixFilter(前缀byte二维数组)
byte[][] prefixes = new byte[][]{Bytes.toBytes("column 1"), Bytes.toBytes("column2")}
new MultipleColumnPrefixFilter (prefixes)
筛选出所有以column1和column2开头子列的cell

专用过滤器 列综合过滤器

DependentColumnFilter
该过滤器尝试找到该列簇、子列所在的Cell。
语法
DependentColumnFilter(列簇、子列)
示例代码
new DependentColumnFilter(

Bytes.toBytes("family1"), Bytes.toBytes("column1"))

筛选出所有列簇family1、子列column1的所有Cell

FilterList
该过滤器代表一个过滤器链 ,它可以包含一组即将应用于目标数据集的过滤器,过滤器间具有“与”和“或”关系。
语法
FilterList(列关系、过滤器集合)
FilterList.Operator.MUST_PASS_ ALL 关系与
FilterList.Operator.MUST_PASS_ ONE 关系或

通过Hbase的过滤器,我们可以在HBase中的数据多个维度(行,列,数据版本)上进行对数据的筛选操作。
Hbase大致上可以分为比较过滤器和专用过滤器。
比较过滤器有行健过滤器、列簇过滤器、子列过滤器、子列范围过滤器、列值过滤器。
专用过滤器有行健前缀过滤器、子列前缀过滤器、多子列前缀过滤器、列综合过滤器、结构过滤器。
除了这些常用过滤器外,Hbase还提供其它一些过滤器,比如分页过滤等,可以在实际使用到的时候灵活选用。

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
Java 分布式数据库 索引
HBASE 比较器和过滤器
HBASE 比较器和过滤器
123 0
|
分布式数据库 Hbase
【HBase】(十)过滤器2
【HBase】(十)过滤器2
180 0
【HBase】(十)过滤器2
|
分布式数据库 API 索引
【HBase】(十)过滤器1
【HBase】(十)过滤器1
201 0
【HBase】(十)过滤器1
|
Java 分布式数据库 Ruby
HBase Filter 过滤器之 Comparator 原理及源码学习
HBase所有的比较器实现类都继承于父类ByteArrayComparable,而ByteArrayComparable又实现了Comparable接口;不同功能的比较器差别在于对父类compareTo()方法的重写逻辑不同。 下面分别对HBase Filter默认实现的七大比较器一一进行介绍。 1. BinaryComparator 介绍:二进制比较器,用于按字典顺序比较指定字节数组。 先看一个小例子: public class BinaryComparatorDemo { public static void main(String[] args) {
436 0
|
Java Shell 分布式数据库
HBase Filter 过滤器之RowFilter详解
前言:本文详细介绍了HBase RowFilter过滤器Java&Shell API的使用,并贴出了相关示例代码以供参考。RowFilter 基于行键进行过滤,在工作中涉及到需要通过HBase Rowkey进行数据过滤时可以考虑使用它。比较器细节及原理请参照之前的更文:HBase Filter 过滤器之比较器 Comparator 原理及源码学习 一。Java Api 头部代码 public class RowFilterDemo { private static boolean isok = false; private static String tableName
542 0
|
Shell 分布式数据库 API
|
分布式数据库 Hbase Go
hbase过滤器filter及自定义filter
hbase过滤器filter及自定义filter 1.filter源码实现: hbase的filter定义在protobuf中(filter.proto文件)。
1929 0
|
分布式数据库 Hbase
HBase常用过滤器
列值过滤器 SingleColumnValueFilter filter = new SingleColumnValueFilter( Bytes.
1211 0
|
5月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
87 0