HBase 字符串过滤器使用词法比较。所以,这只有在否时才有效。所有 id 中的位数相同。您可以做的一件事是对 ID 进行零填充。
所以“123”>“121”,但“123”
另一个想法是创建一个比较器来满足您的要求。只需覆盖 BinaryComparators compareTo() 方法。可能是这样的(我只是在编辑PureJavaComparator中的 compareTo 方法):
@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;
}
它不是超级优化的,它假设没有坏值。如果你确定不会有这样的事情,你也可以滑掉前导零的东西。我还没有测试过,所以请尝试一下,如果它有效,请告诉我!