HBase LESS过滤器不使用字节

时间:2013-12-05 15:46:27

标签: java hbase

我正在尝试在HBase查询服务中实现某些功能,在那里我可以允许用户使用CompareOp.LESS运算符查询保证的“数字”字段。这是我使用的过滤器示例:

new SingleColumnValueFilter(
    Bytes.toBytes("TG-SMA"), 
    Bytes.toBytes("publishdate"),
    CompareOp.LESS, 
    Bytes.toBytes("20131201013434"));

最初,我的最终参数为

new BinaryComparator(Bytes.toBytes("20131201013434"))

但行为没有改变。我在日志中得到的结果是:

org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=10, exceptions:
Thu Dec 05 10:26:33 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:34 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:35 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:36 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:38 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:40 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:44 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:48 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:26:56 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException
Thu Dec 05 10:27:12 EST 2013, org.apache.hadoop.hbase.client.ScannerCallable@69822390, java.lang.NullPointerException

        at org.apache.hadoop.hbase.client.ServerCallable.withRetries(ServerCallable.java:183)
        at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:205)
        at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:120)
        at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:665)

我有另一个可以正常工作的过滤器,例如:

new SingleColumnValueFilter(
    Bytes.toBytes("TG-SMA"), 
    Bytes.toBytes("title"),
    CompareOp.EQUAL, 
    new RegexStringComparator("This" + "\\.*"));

如果我没有第一个过滤器,那么我得到正确的结果。我还可以将此RegexStringComparatorCompareOp.EQUAL个对象用于第一个过滤器的“publishdate”字段,并获得正确的结果。

代码的工作方式,用户可以添加多个过滤器来查询不同的列/值。目前,只实现了这两种过滤器类型,只有第二种过滤器类型正常工作(第一种过滤器无法使用粘贴的错误日志,无论是否存在唯一的过滤器)。

我还读到了关于实现我自己的自定义Comparator/Comparable扩展,但我不相信我可以修改HBase环境(这适用于零售产品),并且实现自定义类需要部署到HBase实例。

如果有人对我为什么会看到这些错误有任何见解,那就太棒了,解决了很多麻烦。提前谢谢。

1 个答案:

答案 0 :(得分:1)

没关系。事实证明,在提交给HBase之前,字段是被序列化的,当BinaryComparator尝试解码它时,它会在空字符上中断。我会在这里留下这个答案,因为我从来没有真正在互联网上找到答案,所以希望这样可以节省一个星期值得潜入兔子洞的人。

修复是通过相同的序列化过程运行查询值,无论结果如何。