44 votes

Scanner avec filtre en utilisant HBase shell

Quelqu'un sait-il comment numériser des enregistrements en fonction d'un filtre de numérisation, par exemple :

column:something = "somevalue"

Quelque chose comme ce mais à partir du shell HBase ?

50voto

havanki4j Points 908

Essayez ceci. C'est plutôt moche, mais ça marche pour moi.

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'))
}

Le shell HBase inclura ce que vous avez dans ~/.irbrc, donc vous pouvez y mettre quelque chose comme ceci (je ne suis pas un expert en Ruby, les améliorations sont les bienvenues) :

# 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

et ensuite vous pouvez juste dire dans le shell :

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

0 votes

C'est en effet super moche. Merci cependant, je n'ai pas pu trouver d'exemples de cela dans le livre HBase docs/book/oreilly.

0 votes

Bonjour, j'ai vu que vous avez mentionné ruby et je n'avais aucune idée de ce qui se passait, puis j'ai cherché et j'ai trouvé que HBase accepte certains ruby scripts ? Est-ce le cas ?

29voto

dape Points 327
scan 'test', {COLUMNS => ['F'],FILTER => \ 
"(SingleColumnValueFilter('F','u',=,'regexstring:http:.*pdf',true,true)) AND \
(SingleColumnValueFilter('F','s',=,'binary:2',true,true))"}

Vous trouverez de plus amples informations here . Notez que plusieurs exemples se trouvent dans le fichier joint Filter Language.docx fichier.

0 votes

Je pense que ce langage de filtrage ne fonctionne que dans les dernières versions de Hbase - dans la version 0.90.6 (cdh 3u6), je n'ai pas réussi à faire fonctionner la moindre variation de ce langage.

0 votes

Je pense qu'il est très utile de regarder la javadoc ; voici la javadoc de la 0.94 : hbase.apache.org/0.94/apidocs/org/apache/hadoop/hbase/filter/

8voto

Tony Points 702

Utilisez le paramètre FILTER de scan comme indiqué dans l'aide à l'utilisation :

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}

5voto

KannarKK Points 191
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);

2 votes

Ce code est en Java, la question porte sur le shell HBase.

5voto

Chetan Somani Points 76

L'un des filtres est Valuefilter qui peut être utilisé pour filtrer toutes les valeurs des colonnes.

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

binaire est l'un des comparateurs utilisés dans le filtre. Vous pouvez utiliser différents comparateurs dans le filtre en fonction de ce que vous voulez faire.

Vous pouvez vous référer à l'url suivante : http:// www.hadooptpoint.com/filters-in-hbase-shell/. Il fournit de bons exemples sur la façon d'utiliser les différents filtres dans HBase Shell.

0 votes

Les réponses qui ne sont que des liens ne sont pas de bonnes questions. Postez un code et expliquez-le pour aider.

0 votes

Le lien ne fonctionne plus. Vous amène à un site de spam

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X