如何在HBase上使用带有SingleColumnValueFilter的自定义比较器?

我试图使用两个SingleColumnValueFilter对象来过滤HBase表中的行,以返回属于该列的长值范围内的所有记录。 根据SingleColumnValueFilter的文档,它会对列值进行字典比较,除非您将其传递给自己的比较器。 api显示SingleColumnValueFilter将WritableByteArrayComparable作为实现此目的的方法。

我写了一个扩展WritableByteArrayComparable并覆盖compare方法的类。

public class LongWritableComparable extends WritableByteArrayComparable { public LongWritableComparable() { super(); } public LongWritableComparable(byte[] value) { super(value); } public LongWritableComparable(Long value) { super(Bytes.toBytes(value)); } @Override public int compareTo(byte[] otherValue) { byte[] thisValue = this.getValue(); long thisLong = Bytes.toLong(thisValue); long otherLong = Bytes.toLong(otherValue); if (thisLong == otherLong) { return 0; } if (thisLong < otherLong) { return -1; } return 1; } } 

我正在使用以下方法设置filter:

 SingleColumnValueFilter lowerBoundAddressResourceFilter = new SingleColumnValueFilter( graphTable.getResource().getName(), Bytes.toBytes(HBaseProperties.getInstance().getQualifierIpAdressLongRepresentation()), CompareFilter.CompareOp.GREATER_OR_EQUAL, new LongWritableComparable(lowerRangeValue)); 

但我看到以下exception:

 2010-08-25 14:24:10,034 ERROR org.apache.hadoop.hbase.regionserver.HRegionServer: org.apache.hadoop.hbase.UnknownScannerException: Name: -1 at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1880) at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:657) at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:915) 2010-08-25 14:24:10,052 INFO org.apache.hadoop.ipc.HBaseServer: IPC Server handler 0 on 60020, call next(-1, 1000) from 172.16.32.215:53206: error: org.apache.hadoop.hbase.UnknownScannerException: Name: -1 org.apache.hadoop.hbase.UnknownScannerException: Name: -1 at org.apache.hadoop.hbase.regionserver.HRegionServer.next(HRegionServer.java:1880) at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:657) at org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:915) 

在网上看到这个执行原因的共识是访问resultScanner.next()的代码花费的时间太长导致到regionServer的租约超时,但此exception被抛出之前

 ResultScanner resultScanner = table.getScanner(scan); 

返回我可以迭代的ResultScanner。

有没有人知道或者知道使用SingleColumnValueFilter的自定义比较器的例子,或者对我做错的任何见解?

看来,带有自定义比较器的jar需要放在要查询的表所在的区域服务器上,位于$ HBASE_HOME / lib文件夹中。 放置jar后重启群集,查询应该有效。