嗨,我是hbase的新手并且正在学习它。 我使用hbase shell创建了一个表,并将值放入该表中。 但现在,当我想使用这样的过滤器获取thos值时:
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会这样做? 还有其他方法可以解决这个问题吗?
答案 0 :(得分:1)
如果你把hbase shell中的数据放到put 'test','r1','col:age','19'
那么它将被存储为String-bytes,所以当你将它与&gt;进行比较时在BinaryComparator上,它将按字典顺序进行比较并返回任何以字符&gt;开头的字符串。比'1'
如果你想把它作为整数字节,你应该把它put 'test','r1','col:age','\x13'
(十六进制值)