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. 過濾器列表