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),我們傳入了比較運算符和比較器對列進行了篩選。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM