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还提供其它一些过滤器,比如分页过滤等,可以在实际使用到的时候灵活选用。