2016-12-28 6 views
0

Я написал собственный компаратор, расширив класс 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 линии.

Любой поможет мне с вашим решением. Заранее спасибо.

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^