zoukankan      html  css  js  c++  java
  • HBase--DependentColumnFilter(参考例过滤器 )详解

      DependentColumnFilter是一种允许用户指定一个参考列或引用列来过滤其他列的过滤器,过滤的原则是基于参考列的时间戳来进行筛选 。

      官方说明:

      

    大意:此过滤器提供两个参数--列族和列限定符,它将返回与参考列具有相同时间戳的行的所有键值对。如果某行不包含这个指定的列,则什么都不返回。

    此过滤器还提供了四种构造函数:

    DependentColumnFilter()

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

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

    DependentColumnFilter(byte[] family,byte[] qulifier,boolean dropDependentColumn,CompareOp valueCompareOp, WritableByteArrayComparable valueComparator)

    相关参数:

    boolean dropDependentColumn -- 决定参考列被返回还是丢弃,为true时表示参考列被返回,为false时表示被丢弃

    CompareOp valueCompareOp --  比较运算符

    WritableByteArrayComparable valueComparator --  比较器

    更深入理解请看下面的例子:

    测试表数据如下(图1):

                                              

    public class HDependentColumnFilter {
    
        public static void dependentColumnFilter(Filter filter,Connection connection){
            try {
            Table table = connection.getTable(TableName.valueOf("student"));    
            Scan scan = new Scan();
            scan.setFilter(filter);//为全表扫描器设置过滤器
            ResultScanner scanner;
            scanner = table.getScanner(scan);
             for (Result result : scanner) {
                for (Cell cell : result.rawCells()) {
                    System.out.println("key:"+CellUtil.getCellKeyAsString(cell)+"  "+"value:"+Bytes.toString(CellUtil.cloneValue(cell)));//输出单元格对应的键和值
                }
             }
            } catch (IOException e) {
                e.printStackTrace();
            }        
        }
        
        public static void main(String[] args) {
            Configuration conf = HBaseConfiguration.create();
            conf.set("habse.rootdir","hdfs://master:9000/hbase-1.0.2");
            conf.set("hbase.zookeeper.quorum","master,node1,node2");
            Connection connection;
            try {
                connection = ConnectionFactory.createConnection(conf);
                Admin admin = connection.getAdmin();            
                //DependentColumnFilter dependentColumnFilter = new DependentColumnFilter( Bytes.toBytes("info"),Bytes.toBytes("name"),false);(1)
                        
                //DependentColumnFilter dependentColumnFilter = new DependentColumnFilter( Bytes.toBytes("info"),Bytes.toBytes("name"),true);  (2)
                
                //DependentColumnFilter dependentColumnFilter = new DependentColumnFilter( Bytes.toBytes("info"),Bytes.toBytes("name"),false,CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("mobin")));    (3)
    
                dependentColumnFilter(dependentColumnFilter,connection);
            } catch (IOException e) {
                e.printStackTrace();
            }      
        }
    }

    解析:

    去掉(1)对应的的注释:以info:name对应的时间戳为条件对同列族的其他列(包括info:name)进行筛选,即以timestamp=1448789165850,timestamp=1448789339803,timestampe=1448796208530为条件对info的其他列进行筛选,根据表(图1)可知info列族中时间戳值为1448789165850,1448789339803

    1448796208530的还有rowkey=1,1info:age对应的行

    其输出如下:

    key:1/info:age/1448789165850/Put/vlen=2/seqid=0 value:22
    key:1/info:name/1448789165850/Put/vlen=5/seqid=0 value:mobin
    key:2/info:name/1448789339803/Put/vlen=6/seqid=0 value:mobin2
    key:3/info:name/1448796208530/Put/vlen=4/seqid=0 value:kpop

    去掉(2)对应的注释:以info:name对应的时间戳为条件对同列族的其他列(不包括info:name)进行筛选,即以timestamp=1448789165850,timestamp=1448789339803,timestampe=1448796208530为条件对info的其他列进行筛选,根据表(图1)可知info列中时间戳值为1448789165850,1448789339803

    1448796208530的还有rowkey=1,1info:age对应的行

    其输出如下:【与(1)不同的是没有返回info:name对应的键值对】

    key:1/info:age/1448789165850/Put/vlen=2/seqid=0  value:22

    去掉(3)对应的注释:以info:name,value="mobin*"(*表示后面可以是任意字符)单元格对应的时间戳为条件对同列族的其他列(包括info:name)进行筛选,根据表可知

    值以mobin开头的对应的时间戳有1448789165850,1448789165850,可得对应的还有rowkey=1. info:age的行也符合过滤条件

    其输出如下:

    key:1/info:age/1448789165850/Put/vlen=2/seqid=0  value:22
    key:1/info:name/1448789165850/Put/vlen=5/seqid=0  value:mobin
    key:2/info:name/1448789339803/Put/vlen=6/seqid=0  value:mobin2

    根据上面的输出结果,我们可以把DependentColumnFilter理解为一个valueFilter和一个时间戳过滤器的组合。如代码(3),我们传入了比较运算符和比较器对列进行了筛选。

  • 相关阅读:
    小程序数据库 用正则查询字符串字段/数组字段
    一键禁用Windows多余?服务
    Switch 10.1.0 无法启动软件请在home菜单中再试一次 解决方法
    算法记录
    LeetCode——面试题 10.01. 合并排序的数组
    LeetCode——98. 验证二叉搜索树
    LeetCode——55. 跳跃游戏
    LeetCode——92. 反转链表 II
    LeetCode——206. 反转链表
    LeetCode——225. 用队列实现栈
  • 原文地址:https://www.cnblogs.com/MOBIN/p/5005871.html
Copyright © 2011-2022 走看看