gpt4 book ai didi

Java:Hadoop:MapReduce:使用过滤器从 hbase 检索数据,int/string 比较

转载 作者:行者123 更新时间:2023-12-01 15:29:07 26 4
gpt4 key购买 nike

我想从 hbase 检索数据用于我的 mapreduce 作业,但我想先过滤它。我只想检索数据,其中包含一个 id 大于或等于 minId 的列。

我将 Id 作为字符串存储在 HBase 中。现在我想知道使用这个过滤器是否有效。


int minId = 123;
过滤器filter = new ValueFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes(minId)));

当存储的 ID 是 String,但用于比较数据的值是 int 时,HBase 如何过滤我的数据?这可以吗?如果我为 BinaryComparator 使用字符串(因此 String mindId = "123"; 这会起作用吗?

感谢您的解答!

最佳答案

HBase 字符串过滤器使用词法比较。因此,只有在“否”的情况下,这才有效。所有 id 中的数字都是相同的。您可以做的一件事就是对 ID 进行零填充。

所以“123”>“121”,但是“123”<“21”。如果你用零填充它,它就变成“123”和“021”,然后你就会得到正确的结果。

另一个想法可以是创建一个比较器来满足您的要求。只需覆盖 BinaryComparator scompareTo() 方法。可能是这样的(我只是编辑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;
}

它不是 super 优化的,并且它假设没有坏值。如果您确定不会出现类似的情况,您也可以忽略前导零。我还没有测试过,所以尝试一下,让我知道它是否有效!

关于Java:Hadoop:MapReduce:使用过滤器从 hbase 检索数据,int/string 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9774250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com