2011-08-31 16 views

Odpowiedz

46

Spróbuj tego. To trochę brzydkie, ale działa dla mnie.

import org.apache.hadoop.hbase.filter.CompareFilter 
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter 
import org.apache.hadoop.hbase.filter.SubstringComparator 
import org.apache.hadoop.hbase.util.Bytes 
scan 't1', { COLUMNS => 'family:qualifier', FILTER => 
    SingleColumnValueFilter.new 
     (Bytes.toBytes('family'), 
     Bytes.toBytes('qualifier'), 
     CompareFilter::CompareOp.valueOf('EQUAL'), 
     SubstringComparator.new('somevalue')) 
} 

HBase powłoka będzie zawierać co masz w ~/.irbrc, dzięki czemu można umieścić coś takiego tam (nie jestem ekspertem Ruby, ulepszenia są mile widziane):

# imports like above 
def scan_substr(table,family,qualifier,substr,*cols) 
    scan table, { COLUMNS => cols, FILTER => 
     SingleColumnValueFilter.new 
      (Bytes.toBytes(family), Bytes.toBytes(qualifier), 
      CompareFilter::CompareOp.valueOf('EQUAL'), 
      SubstringComparator.new(substr)) } 
end 

i wtedy można po prostu powiedzieć w powłoce:

scan_substr 't1', 'family', 'qualifier', 'somevalue', 'family:qualifier' 
+0

To naprawdę jest bardzo brzydkie. Dzięki, nie mogłem znaleźć żadnych przykładów tego w książce HBs docs/book/oreilly. – mumrah

8

Użyj param filtr scan, jak pokazano na pomoc użytkowania:

hbase(main):002:0> scan 

ERROR: wrong number of arguments (0 for 1) 

Here is some help for this command: 
Scan a table; pass table name and optionally a dictionary of scanner 
specifications. Scanner specifications may include one or more of: 
TIMERANGE, FILTER, LIMIT, STARTROW, STOPROW, TIMESTAMP, MAXLENGTH, 
or COLUMNS. If no columns are specified, all columns will be scanned. 
To scan all members of a column family, leave the qualifier empty as in 
'col_family:'. 

Some examples: 

    hbase> scan '.META.' 
    hbase> scan '.META.', {COLUMNS => 'info:regioninfo'} 
    hbase> scan 't1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'} 
    hbase> scan 't1', {FILTER => org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1, 0)} 
    hbase> scan 't1', {COLUMNS => 'c1', TIMERANGE => [1303668804, 1303668904]} 

For experts, there is an additional option -- CACHE_BLOCKS -- which 
switches block caching for the scanner on (true) or off (false). By 
default it is enabled. Examples: 

    hbase> scan 't1', {COLUMNS => ['c1', 'c2'], CACHE_BLOCKS => false} 
28
scan 'test', {COLUMNS => ['F'],FILTER => \ 
"(SingleColumnValueFilter('F','u',=,'regexstring:http:.*pdf',true,true)) AND \ 
(SingleColumnValueFilter('F','s',=,'binary:2',true,true))"} 

Więcej informacji można znaleźć here. Zwróć uwagę, że wiele przykładów znajduje się w załączonym pliku Filter Language.docx.

+0

Myślę, że ten parsujący język filtra działa tylko w późniejszych wersjach Hbase - w 0.90.6 (cdh 3u6) nie mogłem uzyskać żadnej odmiany tego działania. – Mikeb

+0

Myślę, że bardzo przydatne jest spojrzenie na javadoc; oto javadoc dla 0.94: http://hbase.apache.org/0.94/apidocs/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.html – mooreds

6
Scan scan = new Scan(); 
FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL); 

//in case you have multiple SingleColumnValueFilters, 
you would want the row to pass MUST_PASS_ALL conditions 
or MUST_PASS_ONE condition. 

SingleColumnValueFilter filter_by_name = new SingleColumnValueFilter( 
        Bytes.toBytes("SOME COLUMN FAMILY"), 
        Bytes.toBytes("SOME COLUMN NAME"), 
        CompareOp.EQUAL, 
        Bytes.toBytes("SOME VALUE")); 

filter_by_name.setFilterIfMissing(true); 
//if you don't want the rows that have the column missing. 
Remember that adding the column filter doesn't mean that the 
rows that don't have the column will not be put into the 
result set. They will be, if you don't include this statement. 

list.addFilter(filter_by_name); 


scan.setFilter(list); 
+0

Ten kod znajduje się w Javie, pytanie dotyczy powłoki HBase. – Tony

3

Jednym z filtra jest Valuefilter, które mogą być wykorzystywane do filtrowania wartości wszystkich kolumn.

hbase(main):067:0> scan 'dummytable', {FILTER => "ValueFilter(=,'binary:2016-01-26')"}

binarny jest jednym z komparatorami stosowanych w filtrze. Możesz użyć różnych komparatorów w filtrze na podstawie tego, co chcesz zrobić.

Możesz podać następujący adres URL: http: // www.hadooptpoint.com/filters-in-hbase-shell/. Zapewnia dobre przykłady użycia różnych filtrów w powłoce HBase.

+0

Odpowiedzi dotyczące wyłącznie linków nie są dobrymi pytaniami. Opublikuj kod i wyjaśnij, aby pomóc. – KittMedia