HBase筆記--filter的使用


HBASE過濾器介紹:

        所有的過濾器都在服務端生效,叫做謂語下推(predicate push down),這樣可以保證被過濾掉的數據不會被傳送到客戶端。

        注意
        基於字符串的比較器,如RegexStringComparator和SubstringComparator,比基於字節的比較器更,更消耗資源。因為每次比較時它們都需要將給定的值轉化為String.截取字符串子串和正則式的處理也需要花費額外的時間。

        過濾器本來的目的是為了篩掉無用的信息,所有基於CompareFilter的過濾處理過程是返回匹配的值。

各種自定義過濾器: http://www.cnblogs.com/chshnan/archive/2013/03/27/2984143.html

HBase利用Scan對表進行掃描

Scan scan = new Scan();  
ResultScanner scanner = table.getScanner(scan);  
for (Result result : scanner) {//ResultScanner實現了Iterator接口  
    //do something here  
}  

可以使用如下方法對輸出數據進行選擇

    // 返回指定列族下的指定qualifier中的值   
    public Scan addColumn(byte[] family, byte[] qualifier)  
    // 設置掃描的起始行,starRow是存儲時候用的rowKey  
    public Scan setStartRow(byte[] startRow)  
    // 設置掃描的結束行,stopRow是存儲時候用的rowKey 
    public Scan setStopRow(byte[] stopRow)  
    // 設置返回結果的時間戳 
    public Scan setTimeStamp(long timestamp)  
    //設置返回結果的時間戳返回 
    public Scan setTimeRange(long minStamp, long maxStamp)  
    //設置過濾器,這是非常靈活的掃描機制 
    public Scan setFilter(Filter filter)  

如何使用Filter

HBase提供了很多預裝過濾器

1. RowFilter 行過濾器(基於行鍵過濾數據)
public RowFilter(CompareOp rowCompareOp, WritableByteArrayComparable rowComparator)
RowFilter是用來對rowkey進行過濾的,比較符如下:

Operator

Description

LESS

小於

LESS_OR_EQUAL

小於等於

EQUAL

等於

NOT_EQUAL

不等於

GREATER_OR_EQUAL

大於等於

GREATER

大於

NO_OP

排除所有



Comparator

Description

BinaryComparator

使用Bytes.compareTo()比較

BinaryPrefixComparator

和BinaryComparator差不多,從前面開始比較

NullComparator

Does not compare against an actual value but whether a given one is null, or not null.

BitComparator

Performs a bitwise comparison, providing a BitwiseOp class with AND, OR, and XOR operators.

RegexStringComparator

正則表達式

SubstringComparator

把數據當成字符串,用contains()來判斷

例:
相關的過濾方法使用:
提取rowkey以01結尾數據
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator(".*01$"));

提取rowkey以包含201407的數據
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("201407"));

提取rowkey以123開頭的數據
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator("123".getBytes()));

2. 前綴過濾器(RowFilter的特例)
String prefix = "a";
Scan scan = new Scan(prefix.getBytes());
scan.setFilter(new PrefixFilter(prefix.getBytes()));

3. 限定符過濾器(類似於行過濾器RowFilter的比較過濾器,但它用來匹配列限定符而不是行鍵)
比較運算符和比較器類型與RowFilter一樣

Filter filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("colqual120")));

4.ValueFilter  值過濾器(提供與行過濾器或限定符相同功能,只是針對的是單元值)

值過濾器不指定某個列,它會將所有含有某個值的列取出來,混在一起
Filter filter = new ValueFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("foo"))); //過濾掉所有單元值不是foo開頭的列

5. 時間戳過濾器

List<Long> timestamps = new ArrayList<Long>();
timestamps.add(100L);
timestamps.add(200L);
Filter filter = new TimeStampsFilter(timestamps);

 

6. SingleColumnValueFilter(影響查詢性能,在處理大量數據的時候速度可能會慢)

過濾某列值大於多少小於多少:

List<Filter> filters = new ArrayList<Filter>(); 
filters.add( new SingleColumnValueFilter(Bytes.toBytes("pinfo"), //列族
Bytes.toBytes("t"), //列名    
CompareOp.GREATER,Bytes.toBytes("1359901"]) ) //
filters.add( new SingleColumnValueFilter(Bytes.toBytes("pinfo"), 
Bytes.toBytes("t"),    
CompareOp.LESS,Bytes.toBytes("1389901"]) )    
FilterList filterList1 = new FilterList(Operator.MUST_PASS_ALL,filters); 
sn.setFilter(filterList1);

 

7. 過濾器列表


免責聲明!

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



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