为什么SingleColumnValueFilter不会返回<和>运营商?

时间:2014-09-25 13:28:27

标签: java hadoop hbase

嗨,我是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会这样做? 还有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果你把hbase shell中的数据放到put 'test','r1','col:age','19'那么它将被存储为String-bytes,所以当你将它与&gt;进行比较时在BinaryComparator上,它将按字典顺序进行比较并返回任何以字符&gt;开头的字符串。比'1'

如果你想把它作为整数字节,你应该把它put 'test','r1','col:age','\x13'(十六进制值)