java - 为什么 SingleColumnValueFilter 不在 < 和 > 运算符上返回真实答案?

标签 java hadoop hbase

您好,我是 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/

相关文章:

hadoop - 如何从ftp服务器导入csv文件到hadoop(HDFS/HIVE/HBASE)?

java - setHeader 不改变文件名

java util Scanner 抛出未知源错误(无法键入输入)

java - selenium 如何知道一个元素是否有 href 链接,如果没有则继续测试

hadoop - HDFS中小文件瓶颈的解决方案

hadoop - 工具同步日志文件分布式系统

java - JSF panelGroup - 1 个跨度?

java - 无法从另一个类调用方法

logging - Hadoop 作业中的日志记录如何工作?

java - 找不到 Storm Hbase 配置