【轉】hbase權威指南閱讀隨手筆記二之過濾器


http://blog.csdn.net/saint1126/article/details/8257941 

hbase權威指南閱讀隨手筆記二之過濾器

分類: hbase   372人閱讀  評論(0)  收藏  舉報
base過濾器的比較操作符:
 
LESS  <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
NO_OP no operation
比較器:
 
BinaryComparator  按字節索引順序比較指定字節數組,采用Bytes.compareTo(byte[])
BinaryPrefixComparator 跟前面相同,只是比較左端的數據是否相同
NullComparator 判斷給定的是否為空
BitComparator 按位比較 a BitwiseOp class 做異或,與,並操作
RegexStringComparator 提供一個正則的比較器,僅支持 EQUAL 和非EQUAL
SubstringComparator 判斷提供的子串是否出現在table的value中。
 
Hbase的過濾器分類
 
比較過濾器
 
1、Comparision Filters
     1.1  RowFilter
構造函數
[java]  view plain copy
  1. public RowFilter(org.apache.hadoop.hbase.filter.CompareFilter.CompareOp rowCompareOp, org.apache.hadoop.hbase.filter.WritableByteArrayComparable rowComparator) {}  
選擇比較rowkey來確定選擇合適的行信息。
 
[java]  view plain copy
  1. public class RowFilterExample {  
  2.   
  3.   public static void main(String[] args) throws IOException {  
  4.     Configuration conf = HBaseConfiguration.create();  
  5.   
  6.     HBaseHelper helper = HBaseHelper.getHelper(conf);  
  7.     helper.dropTable("testtable");  
  8.     helper.createTable("testtable""colfam1""colfam2");  
  9.     System.out.println("Adding rows to table...");  
  10.     helper.fillTable("testtable"1100100"colfam1""colfam2");  
  11.   
  12.     HTable table = new HTable(conf, "testtable");  
  13.   
  14.     // vv RowFilterExample  
  15.     Scan scan = new Scan();  
  16.     scan.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("col-0"));  
  17.   
  18.     Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, // co RowFilterExample-1-Filter1 Create filter, while specifying the comparison operator and comparator. Here an exact match is needed.  
  19.       new BinaryComparator(Bytes.toBytes("row-22")));  
  20.     scan.setFilter(filter1);  
  21.     ResultScanner scanner1 = table.getScanner(scan);  
  22.     // ^^ RowFilterExample  
  23.     System.out.println("Scanning table #1...");  
  24.     // vv RowFilterExample  
  25.     for (Result res : scanner1) {  
  26.       System.out.println(res);  
  27.     }  
  28.     scanner1.close();  
  29.   
  30.     Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL, // co RowFilterExample-2-Filter2 Another filter, this time using a regular expression to match the row keys.  
  31.       new RegexStringComparator(".*-.5"));  
  32.     scan.setFilter(filter2);  
  33.     ResultScanner scanner2 = table.getScanner(scan);  
  34.     // ^^ RowFilterExample  
  35.     System.out.println("Scanning table #2...");  
  36.     // vv RowFilterExample  
  37.     for (Result res : scanner2) {  
  38.       System.out.println(res);  
  39.     }  
  40.     scanner2.close();  
  41.   
  42.     Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL, // co RowFilterExample-3-Filter3 The third filter uses a substring match approach.  
  43.       new SubstringComparator("-5"));  
  44.     scan.setFilter(filter3);  
  45.     ResultScanner scanner3 = table.getScanner(scan);  
  46.     // ^^ RowFilterExample  
  47.     System.out.println("Scanning table #3...");  
  48.     // vv RowFilterExample  
  49.     for (Result res : scanner3) {  
  50.       System.out.println(res);  
  51.     }  
  52.     scanner3.close();  
  53.     // ^^ RowFilterExample  
  54.   }  
  55. }  


     1.2  FamilyFilter
構造函數
[java]  view plain copy
  1. public FamilyFilter(CompareOp familyCompareOp, WritableByteArrayComparable familyComparator) {}  

通過和列簇比較得到,返回結果為真的數據,示例:
[java]  view plain copy
  1. public class FamilyFilterExample {  
  2.   
  3.   public static void main(String[] args) throws IOException {  
  4.     Configuration conf = HBaseConfiguration.create();  
  5.   
  6.     HBaseHelper helper = HBaseHelper.getHelper(conf);  
  7.     helper.dropTable("testtable");  
  8.     helper.createTable("testtable""colfam1""colfam2""colfam3""colfam4");  
  9.     System.out.println("Adding rows to table...");  
  10.     helper.fillTable("testtable"1102"colfam1""colfam2""colfam3""colfam4");  
  11.   
  12.     HTable table = new HTable(conf, "testtable");  
  13.   
  14.     // vv FamilyFilterExample  
  15.     Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.LESS, // co FamilyFilterExample-1-Filter Create filter, while specifying the comparison operator and comparator.  
  16.       new BinaryComparator(Bytes.toBytes("colfam3")));  
  17.   
  18.     Scan scan = new Scan();  
  19.     scan.setFilter(filter1);  
  20.     ResultScanner scanner = table.getScanner(scan); // co FamilyFilterExample-2-Scan Scan over table while applying the filter.  
  21.     // ^^ FamilyFilterExample  
  22.     System.out.println("Scanning table... ");  
  23.     // vv FamilyFilterExample  
  24.     for (Result result : scanner) {  
  25.       System.out.println(result);  
  26.     }  
  27.     scanner.close();  
  28.   
  29.     Get get1 = new Get(Bytes.toBytes("row-5"));  
  30.     get1.setFilter(filter1);  
  31.     Result result1 = table.get(get1); // co FamilyFilterExample-3-Get Get a row while applying the same filter.  
  32.     System.out.println("Result of get(): " + result1);  
  33.   
  34.     Filter filter2 = new FamilyFilter(CompareFilter.CompareOp.EQUAL,  
  35.       new BinaryComparator(Bytes.toBytes("colfam3")));  
  36.     Get get2 = new Get(Bytes.toBytes("row-5")); // co FamilyFilterExample-4-Mismatch Create a filter on one column family while trying to retrieve another.  
  37.     get2.addFamily(Bytes.toBytes("colfam1"));  
  38.     get2.setFilter(filter2);  
  39.     Result result2 = table.get(get2); // co FamilyFilterExample-5-Get2 Get the same row while applying the new filter, this will return "NONE".  
  40.     System.out.println("Result of get(): " + result2);  
  41.     // ^^ FamilyFilterExample  
  42.   }  
  43. }  


     1.3 QualifierFilter
構造函數
[java]  view plain copy
  1. public QualifierFilter(CompareOp qualifierCompareOp, WritableByteArrayComparable qualifierComparator) {  }  
通過和列名比較,返回為真的數據,示例:
[java]  view plain copy
  1. // vv QualifierFilterExample  
  2.    Filter filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,  
  3.      new BinaryComparator(Bytes.toBytes("col-2")));  
  4.   
  5.    Scan scan = new Scan();  
  6.    scan.setFilter(filter);  
  7.    ResultScanner scanner = table.getScanner(scan);  
  8.    // ^^ QualifierFilterExample  
  9.    System.out.println("Scanning table... ");  
  10.    // vv QualifierFilterExample  
  11.    for (Result result : scanner) {  
  12.      System.out.println(result);  
  13.    }  
  14.    scanner.close();  
  15.   
  16.    Get get = new Get(Bytes.toBytes("row-5"));  
  17.    get.setFilter(filter);  
  18.    Result result = table.get(get);  
  19.    System.out.println("Result of get(): " + result);  
     1.4 ValueFilter
構造函數
[java]  view plain copy
  1. <pre name="code" class="java" style="color: rgb(88, 89, 93); font-size: 14px; line-height: 25px;">public ValueFilter(CompareOp valueCompareOp, WritableByteArrayComparable valueComparator) {}</pre>  
  2. <pre></pre>  
  3. 通過和列名比較,返回為真的數據,示例:  
  4. <pre></pre>  
  5. <pre></pre>  
  6. <pre></pre>  
  7. <pre></pre>  
[java]  view plain copy
  1. Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, // co ValueFilterExample-1-Filter Create filter, while specifying the comparison operator and comparator.  
  2.      new SubstringComparator(".4") );  
  3.   
  4.    Scan scan = new Scan();  
  5.    scan.setFilter(filter); // co ValueFilterExample-2-SetFilter Set filter for the scan.  
  6.    ResultScanner scanner = table.getScanner(scan);  
  7.    // ^^ ValueFilterExample  
  8.    System.out.println("Results of scan:");  
  9.    // vv ValueFilterExample  
  10.    for (Result result : scanner) {  
  11.      for (KeyValue kv : result.raw()) {  
  12.        System.out.println("KV: " + kv + ", Value: " + // co ValueFilterExample-3-Print1 Print out value to check that filter works.  
  13.          Bytes.toString(kv.getValue()));  
  14.      }  
  15.    }  
  16.    scanner.close();  
  17.   
  18.    Get get = new Get(Bytes.toBytes("row-5"));  
  19.    get.setFilter(filter); // co ValueFilterExample-4-SetFilter2 Assign same filter to Get instance.  
  20.    Result result = table.get(get);  
  21.    // ^^ ValueFilterExample  
  22.    System.out.println("Result of get: ");  
  23.    // vv ValueFilterExample  
  24.    for (KeyValue kv : result.raw()) {  
  25.      System.out.println("KV: " + kv + ", Value: " +  
  26.        Bytes.toString(kv.getValue()));  
  27.    }  
     1.5 DependentColumnFilter
該過濾器有兩個參數 —— 列族和列修飾。 嘗試找到該列所在的每一行,並返回該行具有相同時間戳的全部鍵值對。如果某一行不包含指定的列,則該行的任何鍵值對都不返回。
該過濾器還可以有一個可選布爾參數 —— dropDependentColumn. 如果為true, 從屬的列不返回。
該過濾器還可以有兩個可選參數 —— 一個比較操作符和一個值比較器,用於列族和修飾的進一步檢查。如果從屬的列找到,其值還必須通過值檢查,然后就是時間戳必須考慮。
[java]  view plain copy
  1. package filters;  
  2.   
  3. // cc DependentColumnFilterExample Example using a filter to include only specific column families  
  4. import org.apache.hadoop.conf.Configuration;  
  5. import org.apache.hadoop.hbase.HBaseConfiguration;  
  6. import org.apache.hadoop.hbase.KeyValue;  
  7. import org.apache.hadoop.hbase.client.Get;  
  8. import org.apache.hadoop.hbase.client.HTable;  
  9. import org.apache.hadoop.hbase.client.Result;  
  10. import org.apache.hadoop.hbase.client.ResultScanner;  
  11. import org.apache.hadoop.hbase.client.Scan;  
  12. import org.apache.hadoop.hbase.filter.BinaryPrefixComparator;  
  13. import org.apache.hadoop.hbase.filter.CompareFilter;  
  14. import org.apache.hadoop.hbase.filter.DependentColumnFilter;  
  15. import org.apache.hadoop.hbase.filter.Filter;  
  16. import org.apache.hadoop.hbase.filter.RegexStringComparator;  
  17. import org.apache.hadoop.hbase.filter.WritableByteArrayComparable;  
  18. import org.apache.hadoop.hbase.util.Bytes;  
  19. import util.HBaseHelper;  
  20.   
  21. import java.io.IOException;  
  22.   
  23. public class DependentColumnFilterExample {  
  24.   
  25.   private static HTable table = null;  
  26.   
  27.   // vv DependentColumnFilterExample  
  28.   private static void filter(boolean drop,  
  29.       CompareFilter.CompareOp operator,  
  30.       WritableByteArrayComparable comparator)  
  31.   throws IOException {  
  32.     Filter filter;  
  33.     if (comparator != null) {  
  34.       filter = new DependentColumnFilter(Bytes.toBytes("colfam1"), // co DependentColumnFilterExample-1-CreateFilter Create the filter with various options.  
  35.         Bytes.toBytes("col-5"), drop, operator, comparator);  
  36.     } else {  
  37.       filter = new DependentColumnFilter(Bytes.toBytes("colfam1"),  
  38.         Bytes.toBytes("col-5"), drop);  
  39.   
  40.     }  
  41.   
  42.     Scan scan = new Scan();  
  43.     scan.setFilter(filter);  
  44.     ResultScanner scanner = table.getScanner(scan);  
  45.     // ^^ DependentColumnFilterExample  
  46.     System.out.println("Results of scan:");  
  47.     // vv DependentColumnFilterExample  
  48.     for (Result result : scanner) {  
  49.       for (KeyValue kv : result.raw()) {  
  50.         System.out.println("KV: " + kv + ", Value: " +  
  51.           Bytes.toString(kv.getValue()));  
  52.       }  
  53.     }  
  54.     scanner.close();  
  55.   
  56.     Get get = new Get(Bytes.toBytes("row-5"));  
  57.     get.setFilter(filter);  
  58.     Result result = table.get(get);  
  59.     // ^^ DependentColumnFilterExample  
  60.     System.out.println("Result of get: ");  
  61.     // vv DependentColumnFilterExample  
  62.     for (KeyValue kv : result.raw()) {  
  63.       System.out.println("KV: " + kv + ", Value: " +  
  64.         Bytes.toString(kv.getValue()));  
  65.     }  
  66.     // ^^ DependentColumnFilterExample  
  67.     System.out.println("");  
  68.     // vv DependentColumnFilterExample  
  69.   }  
  70.   
  71.   public static void main(String[] args) throws IOException {  
  72.     // ^^ DependentColumnFilterExample  
  73.     Configuration conf = HBaseConfiguration.create();  
  74.   
  75.     HBaseHelper helper = HBaseHelper.getHelper(conf);  
  76.     helper.dropTable("testtable");  
  77.     helper.createTable("testtable""colfam1""colfam2");  
  78.     System.out.println("Adding rows to table...");  
  79.     helper.fillTable("testtable"11010true"colfam1""colfam2");  
  80.   
  81.     table = new HTable(conf, "testtable");  
  82.   
  83.     // vv DependentColumnFilterExample  
  84.     filter(true, CompareFilter.CompareOp.NO_OP, null);  
  85.     filter(false, CompareFilter.CompareOp.NO_OP, null); // co DependentColumnFilterExample-2-Filter Call filter method with various options.  
  86.     filter(true, CompareFilter.CompareOp.EQUAL,  
  87.       new BinaryPrefixComparator(Bytes.toBytes("val-5")));  
  88.     filter(false, CompareFilter.CompareOp.EQUAL,  
  89.       new BinaryPrefixComparator(Bytes.toBytes("val-5")));  
  90.     filter(true, CompareFilter.CompareOp.EQUAL,  
  91.       new RegexStringComparator(".*\\.5"));  
  92.     filter(false, CompareFilter.CompareOp.EQUAL,  
  93.       new RegexStringComparator(".*\\.5"));  
  94.   }  
  95.   // ^^ DependentColumnFilterExample}  


2、Dedicated Filters
     2.1 SingleColumnValueFilter
選定列簇和某一列,然后與列的value相比,正確的返回全部的row,注意如果某一行不含有該列,同樣返回,除非通過filterIfColumnMissing 設置成真。
構造函數
[java]  view plain copy
  1. <pre name="code" class="java">SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOp compareOp, byte[] value)   
  2. SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOp compareOp, WritableByteArrayComparable comparator)</pre>  
  3. <pre></pre>  
  4. 第一個構造函數相當於構建了一個BinaryComparator的實例。其他的跟CompareFilter的參數含義一樣。  
  5. <pre></pre>  
  6. <pre></pre>  
  7. <pre></pre>  
該過濾器通過下面兩個參數 filterIfMissing,latestVersionOnly
[java]  view plain copy
  1. boolean getFilterIfMissing()  
  2. void setFilterIfMissing(boolean filterIfMissing)  
  3. boolean getLatestVersionOnly()  
  4. void setLatestVersionOnly(boolean latestVersionOnly)  
如果 filterIfColumnMissing 標志設為真,如果該行沒有指定的列,那么該行的所有列將不發出。缺省值為假。
如果setLatestVersionOnly 標志設為假,將檢查此前的版本。缺省值為真。實例如下:
[java]  view plain copy
  1. // vv SingleColumnValueFilterExample  
  2.   SingleColumnValueFilter filter = new SingleColumnValueFilter(  
  3.     Bytes.toBytes("colfam1"),  
  4.     Bytes.toBytes("col-5"),  
  5.     CompareFilter.CompareOp.NOT_EQUAL,  
  6.     new SubstringComparator("val-5"));  
  7.   filter.setFilterIfMissing(true);  
  8.   
  9.   Scan scan = new Scan();  
  10.   scan.setFilter(filter);  
  11.   ResultScanner scanner = table.getScanner(scan);  
  12.   // ^^ SingleColumnValueFilterExample  
  13.   System.out.println("Results of scan:");  
  14.   // vv SingleColumnValueFilterExample  
  15.   for (Result result : scanner) {  
  16.     for (KeyValue kv : result.raw()) {  
  17.       System.out.println("KV: " + kv + ", Value: " +  
  18.         Bytes.toString(kv.getValue()));  
  19.     }  
  20.   }  
  21.   scanner.close();  
  22.   
  23.   Get get = new Get(Bytes.toBytes("row-6"));  
  24.   get.setFilter(filter);  
  25.   Result result = table.get(get);  
  26.   System.out.println("Result of get: ");  
  27.   for (KeyValue kv : result.raw()) {  
  28.     System.out.println("KV: " + kv + ", Value: " +  
  29.       Bytes.toString(kv.getValue()));  
  30.   }  
     2.2 SingleColumnValueExcludeFilter
該過濾器同上面的過濾器正好相反,如果條件相符,將不會返回該列的內容。
     2.3 PrefixFilter
所有的row的實例匹配prefix的時候返回結果集合
[java]  view plain copy
  1. Filter filter = new PrefixFilter(Bytes.toBytes("row1"));  
  2. Scan scan = new Scan();  
  3. scan.setFilter(filter);  
  4. ResultScanner scanner = table.getScanner(scan);  
  5.   
  6.   
  7. for(Result result: scanner){  
  8.     for(KeyValue kv: result.raw()) {  
  9.         System.out.println("KV:" + kv + ", Value:"  + Bytes.toString(kv.getValue()));  
  10.     }  
  11. }  
  12. scanner.close();  
  13.   
  14.   
  15. Get get = new Get(Bytes.toBytes("row-5"));  
  16. get.setFilter(filter);  
  17. Result result = table.get(get);  
  18. for(KeyValue kv : result.raw()){  
  19.     System.out.println("KV:" + kv + ", Value:"  + Bytes.toString(kv.getValue()));  
  20. }  
     2.4 PageFilter
頁過濾,通過設置pagesize參數可以返回每一頁page的數量。
客戶端需要記住上一次訪問的row的key值。
[java]  view plain copy
  1. package hbaseTest;  
  2.   
  3. import org.apache.hadoop.conf.Configuration;  
  4. import org.apache.hadoop.hbase.HBaseConfiguration;  
  5. import org.apache.hadoop.hbase.client.HTable;  
  6. import org.apache.hadoop.hbase.client.Result;  
  7. import org.apache.hadoop.hbase.client.ResultScanner;  
  8. import org.apache.hadoop.hbase.client.Scan;  
  9. import org.apache.hadoop.hbase.filter.Filter;  
  10. import org.apache.hadoop.hbase.filter.PageFilter;  
  11. import org.apache.hadoop.hbase.util.Bytes;  
  12.   
  13. import java.io.IOException;  
  14.   
  15. /** 
  16.  * Hello world! 
  17.  */  
  18. public class PageFilterExample {  
  19.     public static void main(String[] args) throws IOException {  
  20.         Configuration config = HBaseConfiguration.create();  
  21.         config.set("hbase.zookeeper.quorum""QT-H-0038");  
  22.   
  23.         String tableName = "testTable";  
  24.         String cfName = "colfam1";  
  25.         final byte[] POSTFIX = new byte[] { 0x00 };  
  26.         HTable table = new HTable(config, tableName);  
  27.         Filter filter = new PageFilter(15);  
  28.         byte[] lastRow = null;  
  29.         int totalRows = 0;  
  30.         while (true) {  
  31.             Scan scan = new Scan();  
  32.             scan.setFilter(filter);  
  33.             if(lastRow != null){  
  34.                 //注意這里添加了POSTFIX操作,不然死循環了  
  35.                 byte[] startRow = Bytes.add(lastRow,POSTFIX);  
  36.                 scan.setStartRow(startRow);  
  37.             }  
  38.             ResultScanner scanner = table.getScanner(scan);  
  39.             int localRows = 0;  
  40.             Result result;  
  41.             while((result = scanner.next()) != null){  
  42.                 System.out.println(localRows++ + ":" + result);  
  43.                 totalRows ++;  
  44.                 lastRow = result.getRow();  
  45.             }  
  46.             scanner.close();  
  47.             if(localRows == 0break;  
  48.         }  
  49.         System.out.println("total rows:" + totalRows);  
  50.     }  
  51.   
  52. }  
因為hbase的row是字典序列排列的,因此上一次的lastrow需要添加額外的0表示新的開始。另外startKey的那一行是包含在scan里面的。
 
     2.5 KeyOnlyFilter
因為一些應用只想獲取data數據,而不是真實的val,可以使用這個過濾器。該過濾器通過
[java]  view plain copy
  1. KeyOnlyFilter(boolean lenAsVal)  
lenAsVal默認為假,表示不把val的長度作為val。否則 val的長度將作為val輸出。
[java]  view plain copy
  1.         final byte[] POSTFIX = new byte[] { 0x00 };  
  2.         HTable table = new HTable(config, tableName);  
  3.         Filter filter = new KeyOnlyFilter(false);  
  4.         byte[] lastRow = null;  
  5.         int totalRows = 0;  
  6.   
  7.   
  8.         Scan scan = new Scan();  
  9.         scan.setFilter(filter);  
  10.         ResultScanner scanner = table.getScanner(scan);  
  11.         for(Result result: scanner){  
  12.             for(KeyValue kv: result.raw()){  
  13.                 System.out.println(kv + ":" + Bytes.toString(kv.getValue()));  
  14.             }  
  15.         }  
 
     2.6 FirstKeyOnlyFilter
在對hbase的表進行掃描的時候,如果指定了FirstKeyOnlyFilter過濾條件則僅僅會返回相同key的第一條kv。
當對hbase中的表進行count,sum操作等集合操作的時候,使用FirstKeyOnlyFilter會帶來性能上的提升。
[java]  view plain copy
  1. public class KeyOnlyFilterExample {  
  2.     public static void main(String[] args) throws IOException {  
  3.         Configuration config = HBaseConfiguration.create();  
  4.         config.set("hbase.zookeeper.quorum""QT-H-0038");  
  5.   
  6.         String tableName = "testTable";  
  7.         String cfName = "colfam1";  
  8.         final byte[] POSTFIX = new byte[] { 0x00 };  
  9.         HTable table = new HTable(config, tableName);  
  10.         Filter filter = new FirstKeyOnlyFilter();  
  11.         byte[] lastRow = null;  
  12.         int totalRows = 0;  
  13.   
  14.         Scan scan = new Scan();  
  15.         scan.setFilter(filter);  
  16.         ResultScanner scanner = table.getScanner(scan);  
  17.         for(Result result: scanner){  
  18.             for(KeyValue kv: result.raw()){  
  19.                 System.out.println(kv + ":" + Bytes.toString(kv.getValue()));  
  20.             }  
  21.         }  
  22.     }  
  23. }  
返回的結果是
[html]  view plain copy
  1. row-5/colfam1:qual1/1354673733503/Put/vlen=4:row1  
  2. row1/colfam1:qual1/1354432930568/Put/vlen=4:val1  
  3. row2/colfam1:qual2/1354432930568/Put/vlen=4:val3  

如果注釋掉過濾器的返回的結果是:
[html]  view plain copy
  1. row-5/colfam1:qual1/1354673733503/Put/vlen=4:row1  
  2. row1/colfam1:qual1/1354432930568/Put/vlen=4:val1  
  3. row1/colfam1:qual2/1354435819120/Put/vlen=4:val2  
  4. row2/colfam1:qual2/1354432930568/Put/vlen=4:val3  
     2.7 InclusiveStopFilter
因為hbase的scan包含start-row不包含stop-row 如果使用這個過濾器我們可以包含stop-row
[java]  view plain copy
  1. HTable table = new HTable(config, tableName);  
  2.   
  3. Filter filter  = new InclusiveStopFilter(Bytes.toBytes("row1"));  
  4.   
  5. Scan scan = new Scan();  
  6. scan.setFilter(filter);  
  7. scan.setStartRow(Bytes.toBytes("row-5"));  
  8. ResultScanner scanner = table.getScanner(scan);  
  9.   
  10. for(Result result: scanner){  
  11.     System.out.println(result);  
  12. }  

會看到row1包含在結果中了。
 
     2.8 TimestampsFilter

當訪問某個Timestamp的新聞的時候,我們需要如下的代碼:

[java]  view plain copy
  1. TimestampsFilter(List<Long> timestamps)  

接受的參數的list參數,該Filter也可以和scan.setTimeRange混合使用。例如:

 

[java]  view plain copy
  1. // vv TimestampFilterExample  
  2.     List<Long> ts = new ArrayList<Long>();  
  3.     ts.add(new Long(5));  
  4.     ts.add(new Long(10)); // co TimestampFilterExample-1-AddTS Add timestamps to the list.  
  5.     ts.add(new Long(15));  
  6.     Filter filter = new TimestampsFilter(ts);  
  7.   
  8.     Scan scan1 = new Scan();  
  9.     scan1.setFilter(filter); // co TimestampFilterExample-2-AddFilter Add the filter to an otherwise default Scan instance.  
  10.     ResultScanner scanner1 = table.getScanner(scan1);  
  11.     // ^^ TimestampFilterExample  
  12.     System.out.println("Results of scan #1:");  
  13.     // vv TimestampFilterExample  
  14.     for (Result result : scanner1) {  
  15.       System.out.println(result);  
  16.     }  
  17.     scanner1.close();  
  18.   
  19.     Scan scan2 = new Scan();  
  20.     scan2.setFilter(filter);  
  21.     scan2.setTimeRange(812); // co TimestampFilterExample-3-AddTSRange Also add a time range to verify how it affects the filter  
  22.     ResultScanner scanner2 = table.getScanner(scan2);  
  23.     // ^^ TimestampFilterExample  
  24.     System.out.println("Results of scan #2:");  
  25.     // vv TimestampFilterExample  
  26.     for (Result result : scanner2) {  
  27.       System.out.println(result);  
  28.     }  
  29.     scanner2.close();  

 

 
     2.9  ColumnCountGetFilter
這個在scan時,無用。
     2.10 ColumnPaginationFilter(下來用到的時候在仔細研究下)
 * A filter, based on the ColumnCountGetFilter, takes two arguments: limit and offset.
 * This filter can be used for row-based indexing, where references to other tables are stored across many columns,
 * in order to efficient lookups and paginated results for end users.
 
[java]  view plain copy
  1. Filter filter = new ColumnPaginationFilter(515);  
  2.   
  3.    Scan scan = new Scan();  
  4.    scan.setFilter(filter);  
  5.    ResultScanner scanner = table.getScanner(scan);  
  6.    // ^^ ColumnPaginationFilterExample  
  7.    System.out.println("Results of scan:");  
  8.    // vv ColumnPaginationFilterExample  
  9.    for (Result result : scanner) {  
  10.      System.out.println(result);  
  11.    }  
  12.    scanner.close();  
     2.11 ColumnPrefixFilter
跟prefxiFilter相似,只是改成了Column,實例如下:
[java]  view plain copy
  1. // vv ColumnPaginationFilterExample  
  2.       Filter filter = new ColumnPrefixFilter(Bytes.toBytes("qual2"));  
  3.   
  4.       Scan scan = new Scan();  
  5.       scan.setFilter(filter);  
  6.       ResultScanner scanner = table.getScanner(scan);  
  7.       // ^^ ColumnPaginationFilterExample  
  8.       System.out.println("Results of scan:");  
  9.       // vv ColumnPaginationFilterExample  
  10.       for (Result result : scanner) {  
  11.           System.out.println(result);  
  12.       }  
  13.       scanner.close();  
  14.    
值scan到與列值與前面匹配的數據。例如qual2匹配qual21。
 
     2.12 RandomRowFilter
隨即的返回row的數據,構造函數為
[java]  view plain copy
  1. RandomRowFilter(float chance)  
chance取值為0到1.0,如果<0則為空,如果>1則包含所有的行。
3、Decorating Filters
裝飾性過濾器
     3.1  SkipFilter
這個過濾器只作用到keyValueFilter上。KeyValueFilter會返回所有滿足條件的row及對應的列。
而加上SkipFilter以后。會發現如果某一行的某一列不符合條件,則這一行全部不返回了。
[java]  view plain copy
  1. public static void main(String[] args) throws IOException {  
  2.    Configuration conf = HBaseConfiguration.create();  
  3.   
  4.    HBaseHelper helper = HBaseHelper.getHelper(conf);  
  5.    helper.dropTable("testtable");  
  6.    helper.createTable("testtable""colfam1");  
  7.    System.out.println("Adding rows to table...");  
  8.    helper.fillTable("testtable"13052truetrue"colfam1");  
  9.   
  10.    HTable table = new HTable(conf, "testtable");  
  11.   
  12.    // vv SkipFilterExample  
  13.    Filter filter1 = new ValueFilter(CompareFilter.CompareOp.NOT_EQUAL,  
  14.      new BinaryComparator(Bytes.toBytes("val-0")));  
  15.   
  16.    Scan scan = new Scan();  
  17.    scan.setFilter(filter1); // co SkipFilterExample-1-AddFilter1 Only add the ValueFilter to the first scan.  
  18.    ResultScanner scanner1 = table.getScanner(scan);  
  19.    // ^^ SkipFilterExample  
  20.    System.out.println("Results of scan #1:");  
  21.    int n = 0;  
  22.    // vv SkipFilterExample  
  23.    for (Result result : scanner1) {  
  24.      for (KeyValue kv : result.raw()) {  
  25.        System.out.println("KV: " + kv + ", Value: " +  
  26.          Bytes.toString(kv.getValue()));  
  27.        // ^^ SkipFilterExample  
  28.        n++;  
  29.        // vv SkipFilterExample  
  30.      }  
  31.    }  
  32.    scanner1.close();  
  33.   
  34.    Filter filter2 = new SkipFilter(filter1);  
  35.   
  36.    scan.setFilter(filter2); // co SkipFilterExample-2-AddFilter2 Add the decorating skip filter for the second scan.  
  37.    ResultScanner scanner2 = table.getScanner(scan);  
  38.    // ^^ SkipFilterExample  
  39.    System.out.println("Total KeyValue count for scan #1: " + n);  
  40.    n = 0;  
  41.    System.out.println("Results of scan #2:");  
  42.    // vv SkipFilterExample  
  43.    for (Result result : scanner2) {  
  44.      for (KeyValue kv : result.raw()) {  
  45.        System.out.println("KV: " + kv + ", Value: " +  
  46.          Bytes.toString(kv.getValue()));  
  47.        // ^^ SkipFilterExample  
  48.        n++;  
  49.        // vv SkipFilterExample  
  50.      }  
  51.    }  
  52.    scanner2.close();  
  53.    // ^^ SkipFilterExample  
  54.    System.out.println("Total KeyValue count for scan #2: " + n);  
  55.  }  
     3.2 WhileMatchFilters

相當於while執行,知道不match就break了返回了。


免責聲明!

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



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