2012-02-15 13 views
38

Nie mogę wymyślić, jak używać filtrów w interfejsie REST HBase (HBase 0.90.4-cdh3u3). Dokumentacja właśnie podaje definicję schematu dla "ciągu", ale nie pokazuje, jak z niego korzystać.Filtr REST HBase (SingleColumnValueFilter)

Tak, jestem w stanie to zrobić:

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

a następnie pobrać z

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

Ale teraz chcę użyć SingleColumnValueFilter i trzeba zakodować, że jakoś w XML. Czy ktoś ma na to przykład?

Dzięki, Mario

+0

Ok, więc zorientowałem się, że mogę utworzyć reprezentację JSON filtru za pomocą ScannerModel-> stringifyFilter(), ale nadal nie będzie działać. – Mario

+0

uderzenie ... nikt? – Mario

+0

Zobacz [HBASE-3482] (https://issues.apache.org/jira/browse/HBASE-3482), używając formatu XML, musisz jakoś zakodować XML FilterModel ... Może wymyślisz odpowiedni format w oparciu o źródło [ScannerModel.java] (http://hbase.apache.org/xref/org/apache/hadoop/hbase/rest/model/ScannerModel.html) (w szczególności wewnętrzna klasa FilterModel) –

Odpowiedz

11

pól filtru w XML Scanner są sformatowane jako ciągi JSON. Ponieważ JSON dla filtru ma wiele cytatów, polecam użycie oddzielnego pliku dla parametru cur o parametrze -d, aby uniknąć pojedynczego cudzysłowu.

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

Jeżeli plik args.txt jest:

<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> 

Jak można dowiedzieć się, w jaki sposób filtr ciąg JSON powinien wyglądać? Oto prosta droga przez kod Javy, który wypluwa usztywniony filtr, biorąc pod uwagę standardowy obiekt filtrujący z Java API HBase.

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

Należy zauważyć, że JSON i XML wymagają danych zakodowanych w Base64. Przetestowałem powyższe polecenie zwijania na stole i działało dobrze.

Jeśli zastanawiasz się, tak, interfejs API REST dla skanerów nie jest jeszcze tak przyjazny dla programistów, jak tylko może być.