2012-10-12 141 views
6

Quiero hacer un escaneo hbase con filtros. Por ejemplo, mi tabla tiene las familias de columnas A, B, C y A tiene una columna X. Algunas filas tienen la columna X y otras no. ¿Cómo puedo implementar el filtro para filtrar todas las filas con la columna X?Cómo filtrar filas con una columna dada (no nulo)?

Respuesta

9

Supongo que está buscando SingleColumnValueFilter en HBase. Como se mencionó en la API

Para evitar toda la fila de ser emitida si la columna no se encuentra en una fila, utilice setFilterIfMissing(boolean) en objeto de filtro. De lo contrario, si se encuentra la columna, toda la fila se emitirá solo si el valor pasa. Si el valor falla, la fila se filtrará.

Pero SingleColumnValueFilter querría tener un valor de columna X "CompareOp" a algo, digamos llevar esta fila si Columnx == "X" o llevar esta fila si Columnx! = "Un valor centinela que puede Columnx nunca tome "y setFilterIfMissing(true) para que si ColumnX tiene algún valor, se devuelva.

Espero que esto le empuje en la dirección correcta.

+0

muchas gracias. ayudó mucho. upvoted – Sanket

1

Puede usar un SkipFilter junto con ColumnPrefixFilter. El filtro ColumnPrefixFilter obtiene claves donde existe la columna (una fila HBase solo tendrá una columna si tiene un valor) el filtro Omitir le dará el "No" en el primer filtro para omitir la fila

+0

Tenga en cuenta que esto solo pasará en las filas donde _todas las columnas de la fila pasan el filtro de prefijo –

0

Ankit Arnon user1573269

La única manera de que pudiera conseguir que funcione, es como a continuación

por lo tanto - tengo una tabla con columnas RULE1, rule2, RULE3 y así sucesivamente. Las filas pueden tener solo la columna rule1, o rule1 y rule2, o rule1 y rule2 y rule3, y así sucesivamente. Diga: quiero extraer las filas que tienen SOLAMENTE la regla1 en ellas. Ahora esto significa que tendré que saltear filas que tengan la regla2 en ellas.

Scan getRules = new Scan(); 
    ColumnPrefixFilter rule1Filter = new ColumnPrefixFilter(Bytes.toBytes("rule1")); 
    SingleColumnValueFilter skipRule2Value = new  SingleColumnValueFilter(Bytes.toBytes("rules"),Bytes.toBytes("rule2"), 
    CompareOp.EQUAL,Bytes.toBytes("0")); 
    SkipFilter skipRule2 = new SkipFilter(skipRule2Value); 
    getRules.setFilter(rule1Filter); 
    getRules.setFilter(skipRule2); 
    ResultScanner scanner = htable.getScanner(getRules); 

Aunque esto funcionó, no estoy muy contento con la solución. Lleva tiempo que hbase se dé cuenta. Hubiera pensado que debería haber un método sencillo y directo que no tenga que verificar el valor. Arnon, tu método no funciona porque SkipFilter omitirá aquellos que DONOT no satisfacen la condición. Por lo tanto, construirlo desde un ColumnPrefixFilter falla el requisito.

Cuestiones relacionadas