您好,我是 hbase 的新手,正在学习它。 我使用 hbase shell 创建了一个表,并使用 shell 将值放入该表中。 但是现在当我想使用这样的过滤器获取这些值时:
HTable table = new HTable(conf, "test");
List<Filter> filters = new ArrayList<Filter>();
SingleColumnValueFilter colValFilter = new SingleColumnValueFilter(Bytes.toBytes("col"), Bytes.toBytes("age")
, CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("118")));
colValFilter.setFilterIfMissing(false);
filters.add(colValFilter);
FilterList fl = new FilterList( FilterList.Operator.MUST_PASS_ALL, filters);
Scan s = new Scan();
s.setFilter(fl);
ResultScanner ss = table.getScanner(s);
JSONArray arr=new JSONArray();
for(Result r:ss){
JSONObject obj=new JSONObject();
for(KeyValue kv : r.raw()){
String column=new String(kv.getQualifier());
String value=new String(kv.getValue());
obj.accumulate(column, value);
}
arr.put(obj);
}
现在,当我运行这个程序时,我得到了不同的结果。就像我得到年龄小于 118 岁但仍然显示的用户。
我的问题:
为什么 SingleColumnValueFilter 这样做? 还有其他方法可以解决这个问题吗?
最佳答案
如果你像 put 'test','r1','col:age','19'
这样从 hbase shell 中放入数据,它将被存储为字符串字节,所以当你将它与> 在 BinaryComparator 上,它将按字典顺序进行比较,并返回任何以 > 字符开头的字符串
如果你想把它作为整数字节,你应该把它放在 put 'test','r1','col:age','\x13'
(十六进制值)
关于java - 为什么 SingleColumnValueFilter 不在 < 和 > 运算符上返回真实答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26039865/