мне нужно отфильтровать значение epoc на основе начального и конечного значения epoc (которое находится в long) в HBase map reduce

Я написал пользовательский компаратор путем расширения WritableByteArrayComparableкласса для сравнения длинного значения в hbase . Вот код для справки.

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 ответ

  1. Я нашел способ, не нужно писать пользовательский компаратор. getMillis () вернется через миллисекунды, но в нашей таблице hbase у нас есть значение epoc в секундах, поэтому я меняю на следующий, и это работает хорошо.
    long startlongval=длинный.valueOf (datetime.get («startDate»).getMillis ()).longValue () / 1000l;
    SingleColumnValueFilter eventCreationStartTimeFilter = новый SingleColumnValueFilter (байт.toBytes («d»), байт.toBytes («et»), CompareOp.Больше, байт.toBytes (startlongval));