Escanear con filtro usando HBase shell

¿Alguien sabe cómo buscar registros de acuerdo a algunos análisis de filtro de decir:

column:something = "somevalue"

Algo como este, pero a partir de HBase shell?

6 Kommentare

  1. 47

    Probar esta. Es feo, pero a mí me funciona.

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

    La HBase shell para que se incluya lo que usted tiene en ~/.irbrc, así que usted puede poner algo como esto en no (yo no soy Ruby experto, las mejoras son bienvenidas):

    # 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
    

    y entonces usted puede simplemente decir que en la shell:

    scan_substr 't1', 'family', 'qualifier', 'somevalue', 'family:qualifier'
    
    • De hecho esta es super feo. Gracias, no podía encontrar ejemplos de esto en la HBase docs/libro/oreilly libro.
  2. 29
    scan 'test', {COLUMNS => ['F'],FILTER => \ 
    "(SingleColumnValueFilter('F','u',=,'regexstring:http:.*pdf',true,true)) AND \
    (SingleColumnValueFilter('F','s',=,'binary:2',true,true))"}
    

    Más información se puede encontrar aquí. Tenga en cuenta que varios de los ejemplos que residen en el adjunto Filter Language.docx archivo.

    • Creo que este Filtro de análisis de la lengua es sólo trabajar en las versiones posteriores de Hbase – en 0.90.6 (cdh 3u6) yo no podía conseguir cualquier variación de este trabajo.
    • Creo que es muy útil para mirar el javadoc, aquí está el javadoc de 0.94: hbase.apache.org/0.94/apidocs/org/apache/hadoop/hbase/filter/…
  3. 8

    Utilizar el FILTRO param de scan, como se muestra en el uso de la ayuda:

    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}
    
  4. 5
    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);
    
    • Este código es de código en Java, la cuestión es preguntarse acerca de la HBase shell.
  5. 5

    Uno de los filtros es Valuefilter que puede ser usado para filtrar todos los valores de la columna.

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

    binario es uno de los comparadores utilizados en el filtro. Puede utilizar diferentes comparadores dentro del filtro basado en lo que usted desea hacer.

    Puede consultar la siguiente dirección: http://http://www.hadooptpoint.com/filters-in-hbase-shell/.
    Proporciona buenos ejemplos sobre cómo utilizar los diferentes filtros en HBase Shell.

    • Enlace sólo respuestas no son buenas preguntas. Post algo de código y explicar a ayudar.
    • El enlace no funciona. Llevará a un spam-sitio
  6. 0

    Agregar setFilterIfMissing(true) al final de la consulta

    hbase(main):009:0> import org.apache.hadoop.hbase.util.Bytes;
     import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
     import org.apache.hadoop.hbase.filter.BinaryComparator;
     import org.apache.hadoop.hbase.filter.CompareFilter;
     import org.apache.hadoop.hbase.filter. Filter;
    
     scan 'test:test8', { FILTER => SingleColumnValueFilter.new(Bytes.toBytes('account'),
          Bytes.toBytes('ACCOUNT_NUMBER'), CompareFilter::CompareOp.valueOf('EQUAL'),
          BinaryComparator.new(Bytes.toBytes('0003000587'))).setFilterIfMissing(true)}
    

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea