HBase строковый фильтр использует лексическое сравнение. Таким образом, это будет работать, только если нет. цифр во всех идентификаторах одинаковы. Одна вещь, которую вы можете сделать, это обнулить идентификаторы.
То есть «123»> «121», но «123» <«21». Если вы обнуляете его, он становится «123» и «021», и тогда вы получите правильный результат. </p>
Другой идеей может быть создание компаратора, соответствующего вашим требованиям. Просто переопределите метод BinaryComparator compareTo (). Может быть что-то вроде этого (я просто редактирую метод CompareTo в PureJavaComparator ):
@Override
public int compareTo(byte[] buffer1, int offset1, int length1,
byte[] buffer2, int offset2, int length2) {
// Remove leading zeros
int l1 = getNumLeadingZeros(buffer1, offset1, length1);
int l2 = getNumLeadingZeros(buffer2, offset2, length2);
offset1=offset1+l1;
length1=length1-l1;
offset2=offset2+l2;
length2=length2-l2;
// If lengths are different, just return the longer int
int ldiff = length1-length2;
if(ldiff != 0) return ldiff;
// If lengths are same, we can use the usual lexical comparator
return Bytes.compareTo(buffer1, offset1, length1, buffer2, offset2, length2);
}
public int getNumLeadingZeros(byte[] arr, int offset, int length) {
int ret = 0;
byte zero = '0';
int i=0;
while(i<length && arr[offset+i]==zero) {
++ret;
}
return ret;
}
Это не супероптимизировано, и предполагается, что нет плохих значений. Вы также можете подсунуть ведущие нули, если вы уверены, что ничего подобного не произойдет. Я не проверял, так что попробуйте и дайте мне знать, если это сработало!