2012-06-13 10 views
31

Quiero escanear filas en un HTable desde hbase shell donde una familia de columnas (es decir, Tweet) tiene un valor particular (es decir, user_id).Escanear filas HTable para el valor de columna específico utilizando el shell HBase

Ahora quiero encontrar todas las filas donde tweet: user_id tiene un valor test1 como esta columna tiene un valor 'test1'

column=tweet:user_id, timestamp=1339581201187, value=test1 

Aunque puedo escanear mesa para un particular usando,

scan 'tweetsTable',{COLUMNS => 'tweet:user_id'} 

pero no encontré ninguna forma de escanear una fila por un valor.

¿Es posible hacerlo a través de Shell HBase?

También miré this question.

Respuesta

36

Es posible sin Colmena:

scan 'filemetadata', { COLUMNS => 'colFam:colQualifier', LIMIT => 10, FILTER => "ValueFilter(=, 'binaryprefix:<someValue.e.g. test1 AsDefinedInQuestion>')" } 

Nota: con el fin de encontrar todas las filas que contienen test1 como valor como se especifica en la pregunta , utilice binaryprefix: test1 en el filtro (ver this answer para más ejemplos)

+8

@utrecht: Puede usted explicar lo es el significado de 'binaryprefix: someValue'. Un ejemplo dará más claridad, – Sudip7

+0

@ Sudip7 Ok. He agregado [ejemplos] (http://stackoverflow.com/a/36585239/2777965). – 030

+0

según el tamaño de la tabla, por lo general, qué tan rápido devuelve esto un resultado. – vbNewbie

0

Desde el shell HBAse, creo que no es posible porque es de alguna manera como la consulta de la que utilizamos desea encontrar datos específicos. Como todos sabemos, HBAse no es SQL así que cuando queremos aplicar la consulta o si tenemos un caso como el tuyo, creo que deberías usar Hive o PIG donde, como Hive, es un buen enfoque, porque en el CERDO tenemos que meternos con los guiones.
De todos modos puede obtener buena garantía sobre colmena desde aquí HIVE integration with HBase y desde Here
Si su único propósito es ver datos que no se obtienen del código (de cualquier cliente) entonces puede usar HBase Explorer o un producto nuevo y muy bueno pero está en su versión beta es "HBase manager". Puede obtenerlo de HBase Manager
Es simple y, lo que es más importante, ayuda a insertar y eliminar datos, aplicando filtros en los calificadores de columnas de la interfaz de usuario al igual que otros clientes de DB. Pruebalo.
espero que sería útil para ti :)

21

Nishu, aquí es solución utilizo periódicamente. En realidad es mucho más poderoso de lo que necesita en este momento, pero creo que usará su poder algún día. Sí, es para el shell HBase. Sólo

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 'yourTable', {LIMIT => 10, FILTER => SingleColumnValueFilter.new(Bytes.toBytes('family'), Bytes.toBytes('field'), CompareFilter::CompareOp.valueOf('EQUAL'), Bytes.toBytes('AAA')), COLUMNS => 'family:field' } 

family:field columna se devuelve con filtro aplicado. Este filtro podría mejorarse para realizar comparaciones más complicadas.

Éstos son también pistas para que considero más útil:

+0

El segundo enlace parece estar muerto. ¿Podrías actualizar? –

1

Para escanear una tabla en hbase sobre la base de cualquier valor de columna, SingleColumnValueFilter se puede utilizar como:

scan 'tablename' ,{ FILTER => "SingleColumnValueFilter('column_family','col_name',>, 'binary:1')" } 
5

Un ejemplo de una búsqueda de texto para una BigBlue valor en la tabla t1 con la familia columna de d: a_content. Una exploración de la tabla mostrará todos los valores disponibles: -

scan 't1' 
... 
column=d:content, timestamp=1404399246216, value=BIGBLUE 
... 

Para buscar sólo por un valor de BigBlue con límite de 1: -

scan 't1',{ COLUMNS => 'd:a_content', LIMIT => 1, FILTER => "ValueFilter(=, 'regexstring:BIGBLUE')" } 

COLUMN+CELL 
column=d:a_content, timestamp=1404399246216, value=BIGBLUE 

Obviamente la eliminación del límite mostrará todas las ocurrencias de esa mesa/cf.

10

Como hubo varias solicitudes para explicar this answer esta respuesta adicional ha sido publicada.

Ejemplo 1

Si

scan '<table>', { COLUMNS => '<column>', LIMIT => 3 } 

volvería:

ROW  COLUMN+CELL 
ROW1 column=<column>, timestamp=<timestamp>, value=hello_value 
ROW2 column=<column>, timestamp=<timestamp>, value=hello_value2 
ROW3 column=<column>, timestamp=<timestamp>, value=hello_value3 

entonces este filtro:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter(=, 'binaryprefix:hello_value2') AND ValueFilter(=, 'binaryprefix:hello_value3')" } 

haría Vuelta:

ROW  COLUMN+CELL 
ROW2 column=<column>, timestamp=<timestamp>, value=hello_value2 
ROW3 column=<column>, timestamp=<timestamp>, value=hello_value3 

Ejemplo 2

Si no se apoya también:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter(!=, 'binaryprefix:hello_value2')" } 

volvería:

ROW  COLUMN+CELL 
ROW1 column=<column>, timestamp=<timestamp>, value=hello_value 
ROW3 column=<column>, timestamp=<timestamp>, value=hello_value3 
+0

¿hay alguna opción para sin especificar el calificador de columna? Necesito buscar los datos usando el filtro de valores. ¿es posible? – karthik

+0

Hola, ¿realmente ejecutó este comando (ejemplo 1)? Está mal. No da salida a lo que mencionas. Emite 0 resultados, ya que está comprobando 'hello_value2' AND' hello_value3' en un solo valor de columna, que obviamente no puede coincidir con ambas condiciones. – jayfah

+0

@ MZ2010 ¿No funciona? ¿Qué versión de hbase usas? – 030

Cuestiones relacionadas