我需要根据hbase map reduce中的开始和结束epoc值(以长为单位)过滤epoc值

时间:2016-12-28 13:39:11

标签: hbase

我通过扩展WritableByteArrayComparable类来编写自定义比较器,用于比较hbase中的long值。以下是供参考的代码。

import org.apache.hadoop.hbase.filter.WritableByteArrayComparable;
import org.apache.hadoop.hbase.util.Bytes;

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, int arg1, int arg2) {
    // TODO Auto-generated method stub
    byte[] thisValue = this.getValue();
    long thisLong = Bytes.toLong(thisValue);
    long otherLong = Bytes.toLong(otherValue,arg1,arg2);

    if (thisLong == otherLong) {
        return 0;
    }
    if (thisLong < otherLong) {
        return -1;
    }
    return 1;
  }

}

我在驱动程序类中使用了比较器,如下所示:

long endtimelongval = Long.valueOf(datetime.get("endDate").getMillis()).longValue();

LongWritableComparable etval=new LongWritableComparable(endtimelongval);

SingleColumnValueFilter eventCreationEndTimeFilter = new SingleColumnValueFilter(Bytes.toBytes("d"), Bytes.toBytes("et"), CompareOp.LESS,etval );

当我执行上面的代码时,它会抛出以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.hadoop.hbase.filter.SingleColumnValueFilter.<init>([B[BLorg/apache/hadoop/hbase/filter/CompareFilter$CompareOp;Lorg/apache/hadoop/hbase/filter/WritableByteArrayComparable;)V

SingleColumnValueFilter行。

任何人都可以帮助我解决您的问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了一种方法,无需编写自定义比较器。 getMillis()将以毫秒为单位返回,但在我们的hbase表中,我们有以秒为单位的epoc值,因此我更改为以下内容并且工作正常。
long startlongval = Long.valueOf(datetime.get(&#34; startDate&#34;)。getMillis())。longValue()/ 1000l;
SingleColumnValueFilter eventCreationStartTimeFilter = new SingleColumnValueFilter(Bytes.toBytes(&#34; d&#34;),Bytes.toBytes(&#34; et&#34;),CompareOp.GREATER,Bytes.toBytes(startlongval));