1. 程式人生 > >HBase shell scan命令中filter的使用

HBase shell scan命令中filter的使用

在hbase shell中使用scan命令時,可以使用filter來過濾記錄。
這兒說明使用SingleColumnValueFilter來進行過濾的情況:

1)使用正則表示式:
scan ‘tweet0’, {FILTER=>”SingleColumnValueFilter(‘info’,’pubtime’,=,’regexstring:2014-11-08.*’)”}
匹配pubtime的以2014-11-08打頭的值的記錄。

2)使用上下邊界值:
scan ‘tweet0’, {FILTER=>”SingleColumnValueFilter(‘info’,’pubtime’,>=,’binary:2014-11-08 19:26:27’) AND SingleColumnValueFilter(‘info’,’pubtime’,<=,’binary:2014-11-10 20:20:00’)”}

3)比較整數值:
scan ‘tweet0’, {FILTER=>”SingleColumnValueFilter(‘emotion’,’PB’,=,’binary:\x00\x00\x00\x05’)”, COLUMNS=>[‘emotion:PB’]}
這是比較整數值5,因為在查詢時,這個5顯示的也是\x00\x00\x00\x05。

4)引數說明:
SingleColumnValueFilter 這個過濾器有6個引數:列族、列名、比較運算子、比較器和兩個可選引數:filterIfColumnMissing和setLatestVersionOnly。
filterIfColumnMissing:如果設定為true,則會把沒有過濾器所指定列的行都過濾掉。預設值是false,所以看上去,當沒有過濾器所指定的列時,過濾器不起作用。
setLatestVersionOnly:如果設定為false,則除了檢查最新版本,還會檢查以前的版本。預設值是true,只檢查最新版本的值。
這兩個引數要麼一起使用,要麼都不使用。

5)比較器:
前面例子中的regexstring:2014-11-08.*、binary:\x00\x00\x00\x05,這都是比較器。HBase的filter有四種比較器:
(1)二進位制比較器:如’binary:abc’,按字典排序跟’abc’進行比較
(2)二進位制字首比較器:如’binaryprefix:abc’,按字典順序只跟’abc’比較前3個字元
(3)正則表示式比較器:如’regexstring:ab*yz’,按正則表示式匹配以ab開頭,以yz結尾的值。這個比較器只能使用=、!=兩個比較運算子。
(4)子串比較器:如’substring:abc123’,匹配以abc123開頭的值。這個比較順也只能使用=、!=兩個比較運算子。

6)比較運算子:
HBase的filter中有7個比較運算子:

1. LESS (<)
2. LESS_OR_EQUAL (<=)
3. EQUAL (=)
4. NOT_EQUAL (!=)
5. GREATER_OR_EQUAL (>=)
6. GREATER (>)
7. NO_OP (no operation)(不知道這個怎麼用)

7)還可以如下寫法:
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.apache.hadoop.hbase.filter.CompareFilter
import org.apache.hadoop.hbase.filter.BinaryComparator
scan ‘tweet0’, { FILTER => SingleColumnValueFilter.new(Bytes.toBytes(‘info’), Bytes.toBytes(‘id’), CompareFilter::CompareOp.valueOf(‘EQUAL’), BinaryComparator.new(Bytes.toBytes(‘1001158684’))), COLUMNS=>[‘info:id’]}

但是,當在比較器中寫一個整數時,總是匹配不成功,不知道錯在哪兒。如:
scan ‘tweet0’, { FILTER => SingleColumnValueFilter.new(Bytes.toBytes(‘emotion’), Bytes.toBytes(‘PB’), CompareFilter::CompareOp.valueOf(‘EQUAL’), BinaryComparator.new(Bytes.toBytes(5))), COLUMNS=>[‘emotion:PB’]}

注意:
1)如果scan中指定了COLUMNS,則FILTER中所使用的列需要包含在所指定的COLUMNS中,否則,filter不起作用。
2)HBase中主要的操作物件是一個個的cell,每個cell都可以有多個版本。如果使用過濾器ValueFilter,就會只有那些符合條件的cell被查出來。跟關係資料庫的查詢不同,關係資料庫查出來的結果中各行都有相同的列。而HBase,查出來的結果中,不同的行會有不同的列。
3)filter不會降低服務方的IO,它會把符合條件的子集傳給客戶端。即,它是在對查出的結果進行過濾,而不是象原來sql中的where子句。所以,如果要查出的結果中不包含filter需要的列,則filter就不能發揮作用。