2012-02-15 47 views
38

我无法弄清楚如何在HBase REST接口(HBase 0.90.4-cdh3u3)中使用过滤器。该文档只给了我一个“字符串”的架构定义,但并未显示如何使用它。HBase REST过滤器(SingleColumnValueFilter)

所以,我能够做到这一点:

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

,然后用

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

检索但现在我想用一个SingleColumnValueFilter,并必须以某种方式编码的XML。 有没有人有这样的例子?

感谢, 马里奥

+0

好的,所以我想出了我可以使用ScannerModel-> stringifyFilter()来创建JSON过滤器,但它仍然不起作用。 – Mario 2012-02-21 09:52:00

+0

颠簸......没有人? – Mario 2012-03-31 10:08:47

+0

请参阅[HBASE-3482](https://issues.apache.org/jira/browse/HBASE-3482),当使用XML格式时,您需要以某种方式对FilterModel进行XML编码......也许您可以计算出正确的格式基于[ScannerModel.java]的源代码(http://hbase.apache.org/xref/org/apache/hadoop/hbase/rest/model/ScannerModel.html)(具体来说是内部类FilterModel) – 2012-05-28 16:11:47

回答

11

在扫描仪XML过滤器领域是JSON格式的字符串。由于过滤器的JSON在其中有许多引号,因此我建议使用单独的文件作为curl的-d参数,以避免单引号。

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

该文件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> 

你怎么发现的JSON过滤字符串应该怎么样子的呢?下面是通过Java代码的简单方法,该代码从HBase的Java API中给出一个标准的Filter对象,并将字符串化的过滤器吐出。

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

请注意,JSON和XML需要使用Base64编码的数据。我已经在桌上测试了上面的curl命令,它工作得很好。

如果您想知道,是的,扫描仪的REST API还不像开发人员友好,因为它可以得到。