nosql - tablas - Escanee filas de HTable para valores de columna específicos usando el shell HBase
hbase show tables (6)
Como hubo varias solicitudes para explicar esta respuesta, esta respuesta adicional se ha publicado.
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'')" }
volvería:
ROW COLUMN+CELL
ROW2 column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3 column=<column>, timestamp=<timestamp>, value=hello_value3
Ejemplo 2
Si no es compatible 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
Quiero escanear filas en un HTable desde el shell hbase donde una familia de columnas (es decir, Tweet) tiene un valor particular (es decir, user_id).
Ahora quiero encontrar todas las filas donde tweet: user_id tiene valor test1
ya que esta columna tiene el valor ''test1''
column=tweet:user_id, timestamp=1339581201187, value=test1
Aunque puedo escanear la tabla para un uso particular,
scan ''tweetsTable'',{COLUMNS => ''tweet:user_id''}
pero no encontré ninguna forma de escanear una fila por un valor.
¿Es posible hacer esto a través de HBase Shell?
Revisé esta pregunta también.
Desde el shell HBAse, creo que no es posible porque es de alguna manera como la consulta desde la que usamos desea buscar 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 una buena garantía sobre la colmena desde aquí la integración de HIVE con HBase y desde Here
Si su único propósito es ver datos que no se obtienen desde el código (de cualquier cliente), entonces puede usar HBase Explorer o un producto nuevo y muy bueno, pero está en su versión beta y es "Administrador de HBase". Puedes obtener esto 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 DB. Pruebalo.
Espero que sea útil para ti :)
Es posible sin Hive:
scan ''filemetadata'',
{ COLUMNS => ''colFam:colQualifier'',
LIMIT => 10,
FILTER => "ValueFilter( =, ''binaryprefix:<someValue.e.g. test1 AsDefinedInQuestion>'' )"
}
Nota: para encontrar todas las filas que contienen test1 como valor especificado en la pregunta, use binaryprefix: test1 en el filtro (consulte esta respuesta para ver más ejemplos)
Nishu, aquí está la solución que uso 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.
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'' }
Solo family:field
columna de family:field
se devuelve con filtro aplicado. Este filtro podría mejorarse para realizar comparaciones más complicadas.
Aquí también hay sugerencias para ti que considero más útiles:
- http://hadoop-hbase.blogspot.com/2012/01/hbase-intra-row-scanning.html - Explicación de escaneo dentro de la fila (API de Java).
- https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/filter/FilterBase.html - JavaDoc para la clase FilterBase con enlaces a descendientes que en realidad se pueden usar del mismo estilo. OK, la sintaxis del shell será ligeramente diferente, pero con el ejemplo anterior puedes usar esto.
Para escanear una tabla en hbase en función de cualquier valor de columna, SingleColumnValueFilter se puede usar como:
scan ''tablename'' ,
{
FILTER => "SingleColumnValueFilter(''column_family'',''col_name'',>, ''binary:1'')"
}
Un ejemplo de búsqueda de texto para un valor BIGBLUE en la tabla t1 con familia de columnas de d: a_content. Un escaneo de la tabla mostrará todos los valores disponibles:
scan ''t1''
...
column=d:a_content, timestamp=1404399246216, value=BIGBLUE
...
Para buscar solo un valor de BIGBLUE con límite de 1, intente con el siguiente comando: -
scan ''t1'',{ COLUMNS => ''d:a_content'', LIMIT => 1, FILTER => "ValueFilter( =, ''regexstring:BIGBLUE'' )" }
COLUMN+CELL
column=d:a_content, timestamp=1404399246216, value=BIGBLUE
Obviamente, eliminar el límite mostrará todas las ocurrencias en esa tabla / cf.