2012-02-15 18 views
38

No sé cómo usar filtros en la interfaz REST HBase (HBase 0.90.4-cdh3u3). La documentación simplemente me da una definición de esquema para una "cadena", pero no muestra cómo usarla.Filtro HBASE REST (SingleColumnValueFilter)

Por lo tanto, soy capaz de hacer esto:

curl -v -H 'Content-Type: text/xml' -d '<Scanner startRow="ddo" stopRow="ddp" batch="1024"/>' 'http://hbasegw:8080/table/scanner' 

y recuperar con

curl -s -H "Content-Type: text/xml" http://hbasegw:8080/table/scanner/13293426893883128482b | tidy -i -q -xml 

Pero ahora quiero usar un SingleColumnValueFilter y tienen que codificar que de alguna manera en el XML. ¿Alguien tiene un ejemplo para esto?

Gracias, Mario

+0

Ok, entonces descubrí que puedo hacer una representación JSON del filtro con ScannerModel-> stringifyFilter(), pero aún así no funcionará. – Mario

+0

golpe ... ¿nadie? – Mario

+0

Consulte [HBASE-3482] (https://issues.apache.org/jira/browse/HBASE-3482), cuando use el formato XML, necesita codificar XML FilterModel de alguna manera ... Tal vez pueda averiguar el formato correcto basado en la fuente de [ScannerModel.java] (http://hbase.apache.org/xref/org/apache/hadoop/hbase/rest/model/ScannerModel.html) (específicamente la clase interna FilterModel) –

Respuesta

11

campos de filtro en el XML escáner son cadenas con formato JSON. Dado que el JSON para el filtro tiene muchas comillas, recomiendo usar un archivo separado para el parámetro -d de curl, para evitar la comilla simple.

curl -v -H "Content-Type:text/xml" -d @args.txt http://hbasegw:8080/table/scanner

Cuando el archivo es args.txt:

<Scanner startRow="cm93MDE=" endRow="cm93MDg=" batch="1024"> 
    <filter> 
    { 
     "latestVersion":true, "ifMissing":true, 
     "qualifier":"Y29sMQ==", "family":"ZmFtaWx5", 
     "op":"EQUAL", "type":"SingleColumnValueFilter", 
     "comparator":{"value":"MQ==","type":"BinaryComparator"} 
    } 
    </filter> 
</Scanner> 

¿Cómo descubrir cómo la cadena de filtro JSON debe ser similar? Aquí hay una manera fácil a través del código de Java que escupe el filtro stringified dado un objeto de filtro estándar de la API de Java de HBase.

SingleColumnValueFilter filter = new SingleColumnValueFilter(
    Bytes.toBytes("family"), 
    Bytes.toBytes("col1"), 
    CompareFilter.CompareOp.EQUAL, 
    Bytes.toBytes("1") 
); 
System.out.println(ScannerModel.stringifyFilter(filter)); 

Observe que el JSON y el XML requieren datos codificados en Base64. He probado el comando curl anterior en una tabla y funcionó bien.

En caso de que se pregunte, sí, la API REST para escáneres aún no es tan amigable con los desarrolladores como puede ser.