我正在尝试在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" + "\\.*"));
如果我没有第一个过滤器,那么我得到正确的结果。我还可以将此RegexStringComparator
和CompareOp.EQUAL
个对象用于第一个过滤器的“publishdate”字段,并获得正确的结果。
代码的工作方式,用户可以添加多个过滤器来查询不同的列/值。目前,只实现了这两种过滤器类型,只有第二种过滤器类型正常工作(第一种过滤器无法使用粘贴的错误日志,无论是否存在唯一的过滤器)。
我还读到了关于实现我自己的自定义Comparator/Comparable
扩展,但我不相信我可以修改HBase环境(这适用于零售产品),并且实现自定义类需要部署到HBase实例。
如果有人对我为什么会看到这些错误有任何见解,那就太棒了,解决了很多麻烦。提前谢谢。
答案 0 :(得分:1)
没关系。事实证明,在提交给HBase之前,字段是被序列化的,当BinaryComparator
尝试解码它时,它会在空字符上中断。我会在这里留下这个答案,因为我从来没有真正在互联网上找到答案,所以希望这样可以节省一个星期值得潜入兔子洞的人。
修复是通过相同的序列化过程运行查询值,无论结果如何。