2012-02-15 11 views
38

non riesco a capire come utilizzare i filtri nell'interfaccia HBase riposo (HBase 0.90.4-cdh3u3). La documentazione mi fornisce semplicemente una definizione dello schema per una "stringa", ma non mostra come usarla.HBase RIPOSO filtro (SingleColumnValueFilter)

Quindi, sono in grado di fare questo:

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

e quindi recuperare con

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

Ma ora voglio usare un SingleColumnValueFilter e hanno per codificare che in qualche modo in XML. Qualcuno ha un esempio per questo?

Grazie, Mario

+0

Ok, così ho capito che posso fare una rappresentazione JSON del filtro con ScannerModel-> stringifyFilter(), ma ancora non funziona. – Mario

+0

urto ... nessuno? – Mario

+0

Sede [HBase-3482] (https://issues.apache.org/jira/browse/HBASE-3482), quando si utilizza il formato XML è necessario codificare il XML FilterModel in qualche modo ... Forse si può capire il formato giusto basata sulla fonte di [ScannerModel.java] (http://hbase.apache.org/xref/org/apache/hadoop/hbase/rest/model/ScannerModel.html) (specificamente la FilterModel classe interna) –

risposta

11

campi di filtro nel XML scanner sono stringhe formattate come JSON. Poiché il JSON per il filtro ha molte citazioni al suo interno, consiglio di utilizzare un file separato per il parametro -d di curl, per evitare la virgoletta singola.

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

Dove il file 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> 

Come si fa a scoprire come la stringa di filtro JSON dovrebbe assomigliare? Ecco un modo semplice attraverso il codice Java che sputa il filtro stringificato dato un oggetto Filter standard dall'API Java di HBase.

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

Si noti che JSON e XML richiedono dati codificati in Base64. Ho testato il comando di ricciolo sopra su un tavolo e ha funzionato bene.

Nel caso in cui vi state chiedendo, sì, l'API REST per gli scanner non è ancora così developer-friendly come si può ottenere.