Я написал собственный компаратор, расширив класс WritableByteArrayComparable
для сравнения длинного значения в hbase. Вот код для справки.Мне нужно отфильтровать значение epoc на основе значения начала и конца epoc (которое длиннее) в hbase map уменьшить
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
линии.
Любой поможет мне с вашим решением. Заранее спасибо.