当前位置: 首页 > 面试题库 >

如何在HBase上将自定义比较器与SingleColumnValueFilter一起使用?

潘意
2023-03-14
问题内容

我正在尝试使用两个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;
    }
}

我正在使用以下方法设置过滤器:

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

但看到以下异常:

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)

在Web上查看导致此执行的原因的共识是,访问resultScanner.next()的代码花费的时间太长,导致对regionServer的租约超时,但是此异常在

ResultScanner resultScanner = table.getScanner(scan);

返回带有可迭代通过的ResultScanner。

有谁知道或知道将自定义比较器与SingleColumnValueFilter一起使用的示例,或者是否对我做错了有任何了解?


问题答案:

似乎具有您的自定义比较器的jar需要放置在您要查询的表所在的区域服务器上,该服务器位于$ HBASE_HOME /
lib文件夹中。放置jar之后,重新启动集群,查询应该可以工作。



 类似资料:
  • 问题内容: 我知道Android 很棒。它使我们能够播放本地文件以及媒体流。而且非常容易使用(例如): 通过调用具有不同参数集的重载,可以设置不同类型的DataSource 。这个函数有一个有趣的原型: 看起来可以用自己的实现完全覆盖。它确实有效: 并在主要代码中: 是的,这很好。但是,如果我尝试音频/ aacp广播流(例如:“ http://111.223.51.8:8005”-它是“ COOL

  • 问题内容: 我只是开始看一下Mattt出色的新Alamofire快速联网库,并且不确定如何将其与自定义标头一起使用。 我正在尝试从AFNetworking转换为Alamofire的代码是这样的: 问题答案: 根据官方文档,不建议修改会话配置: 不建议将其用于Authorization或Content- Type标头。而是分别使用URLRequestConvertible和ParameterEnco

  • 问题内容: 我想为汽车清单开发一个排序演示。我正在使用数据表显示汽车列表。现在实际上我想按汽车颜色对列表进行排序。这里不是按字母顺序排序的。我想使用我的自定义排序顺序,例如先是红色汽车,然后是蓝色,等等。 为此,我尝试使用,但它只允许按字母顺序排序。 因此,任何人都可以指导我实现使用该技术的方法,以便使排序变得更快。 问题答案: 我建议你为汽车颜色创建一个枚举,而不要使用字符串,并且枚举的自然顺序

  • 我正在将我的Spring应用程序从Spring-boot 1.5.9迁移到Spring-boot 2.0.0。使用这个新的Spring包,我在Redis中缓存数据时遇到了一些问题。 在我的配置中,我有3个具有不同TTL(长、中、短)的CacheManager: 我还有一个自定义RestTemplate: 在上一个Spring版本中,缓存的每个数据都使用这个RestTemplate,并使用Gener

  • 下面的代码片段适用于条件1,但不适用于条件2。