HBase总结(6)--比较过滤器

来源:互联网 发布:api原油库存数据官网 编辑:程序博客网 时间:2024/05/17 10:53

一、介绍

比较过滤器是一种专门的用于比较的过滤器,通过实现比较运算符与比较器,来实现用户的需求

二、详解

1、行过滤器

该种过滤器主要对行值(row)进行过滤,不符合条件的row的行将要被过滤掉。

public void testRowFilter(String tableName,CompareOp compareOp,ByteArrayComparable compare){Configuration conf=init();try {//创建表连接HTable table=new HTable(conf, tableName);//创建一个scan对象Scan scan=new Scan();//创建一个rowfilter,并对其进行赋值RowFilter filter=new RowFilter(compareOp, compare);scan.setFilter(filter);//进行输出查询ResultScanner rs=table.getScanner(scan);Result result=null;while((result=rs.next())!=null){KeyValue[] kvs=result.raw();for(KeyValue kv:kvs){System.out.println(kv.toString());}}rs.close();table.close();} catch (Exception e) {// TODO: handle exception}}public static void main(String[] args)    {        RowFilterExaple exaple=new RowFilterExaple();        exaple.testRowFilter("test",CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes("row-5")));    }

该段代码的意思为:获取row值小于等于row-5的行进行显示。其他的被过滤掉。

注意:因为在对比时使用compareTo()函数对二进制进行比较,因此会出现 row-10 是小于 row-5 值,因为转换成字节数组以后,1 是小于 5 的。

2、列簇过滤器:FamilyFilter

该过滤器是对列簇进行过滤,即在获取数据过程中,不符合该过滤器条件的列簇内的数据,全部过滤掉。

public void  exapmle(String tableName){Configuration conf=init();try {HTable table=new HTable(conf, tableName);//创建scan对象Scan scan=new Scan();//添加列簇过滤器FamilyFilter filter=new FamilyFilter(CompareOp.EQUAL,new SubstringComparator("t"));scan.setFilter(filter);//进行获取ResultScanner rs=table.getScanner(scan);Result result=null;while((result=rs.next())!=null){KeyValue[] kvs=result.raw();for(KeyValue kv:kvs){System.out.println(kv.toString());}}//关闭扫描器rs.close();//关闭表连接table.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}

该段代码的意思为:名称中含有字母‘t’的列簇中的数据可以被返回到客户端。

3、列明过滤器:QualifierFilter

列名过滤器主要是对扫描到的所有数据的列进行过滤,符合条件的列的数据被返回到客户端,不合符责备过滤掉

public void example(String tableName){Configuration conf=init();try {HTable table=new HTable(conf, tableName);//生成scan对象Scan scan=new Scan();//创建过滤器//使用 二进制前缀比较器QualifierFilter filter=new QualifierFilter(CompareOp.EQUAL,new BinaryPrefixComparator(Bytes.toBytes("test")));//添加过滤器scan.setFilter(filter);//获取数据ResultScanner rs=table.getScanner(scan);//展示数据Result result=null;while((result=rs.next())!=null){KeyValue[] kvs=result.raw();for(KeyValue kv:kvs){System.out.println(kv.toString());}}//释放资源rs.close();table.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}

列名等于test的列的数据被返回到客户端。其他列的数据过滤掉。

4、值过滤器:ValueFilter

对返回来的数据的值进行过滤,只有符合条件的KeyValue键值对才会被返回。

public void example(String tableName){Configuration conf=init();try {//创建表连接HTable table=new HTable(conf, tableName);//创建scanScan scan=new Scan();//创建值过滤器ValueFilter filter=new ValueFilter(CompareOp.NOT_EQUAL,new NullComparator());//添加过滤器scan.setFilter(filter);//进行数据湖区ResultScanner rs=table.getScanner(scan);//进行数据展示Result result=null;while((result=rs.next())!=null){KeyValue[] kvs=result.raw();for(KeyValue kv:kvs){System.out.println(Bytes.toString(kv.getValue()));}}//关闭数据源rs.close();table.close();} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}

值不为空的KeyValue对象才能够被返回到客户端,为空的Keyvalue键值对被过滤掉

5、参考列过滤器:DependentColumnFilter

该过滤器不同于上述的过滤器的使用方法,其初始化参数会多一些:

DependentColumnFilter(byte[] family,byte[] qualifier)

DependentColumnFilter(byte[] family,byte[] qualifier,boolean dropDependentColumn)

DependentColumnFilter(byte[] family,byte[] qualifier,boolean dropDependentColumn,CompareOp compareOp,ByteArrayComparable compare)

该中过滤器在没有设置最后两个参数时,相当于一个时间戳过滤器,即获取制定列中的所有时间戳。在进行过滤时,当一个KeyValue值的时间戳与过滤器中的时间戳(过滤器中可能含有多个时间戳,只需要匹配一个即可)不相同时,该KeyValue对象立刻被过滤掉。而dropDependentColumn参数则是指定是否将制定列中的数据过滤掉。true时,则不返回指定列的数据,否认将指定列中的数据返回到客户端。

当过滤器设置了后两个参数,则首先对指定列中的数据进行过滤,则符合条件的数据的时间戳才会被过滤器获取,然后过滤器才对同行其他列、或者其他行中的所有的列进行数据过滤。

因为数据问题,并没有相应的代码进行测试。下面的连接中展示了该过滤器的使用方法:

http://www.thebigdata.cn/HBase/15872.html

0 0
原创粉丝点击