1

我正在尝试使用过滤器列表检索范围内的行,但我没有成功。下面是我的代码片段。

我想检索 1000 到 2000 之间的数据。

HTable 表 = 新 HTable(conf, "TRAN_DATA");

    List<Filter> filters = new ArrayList<Filter>();

    SingleColumnValueFilter filter1 = new SingleColumnValueFilter(Bytes.toBytes("TRAN"),
              Bytes.toBytes("TRAN_ID"),
              CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("1000")));
    filter1.setFilterIfMissing(true);
    filters.add(filter1);

    SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("TRAN"),
              Bytes.toBytes("TRAN_ID"),
              CompareFilter.CompareOp.LESS,new BinaryComparator(Bytes.toBytes("2000")));

    filters.add(filter2);

    FilterList filterList = new FilterList(filters);

    Scan scan = new Scan();
    scan.setFilter(filterList);
    ResultScanner scanner1 = table.getScanner(scan);

    System.out.println("Results of scan #1 - MUST_PASS_ALL:");
    int n = 0;

    for (Result result : scanner1) {
        for (KeyValue kv : result.raw()) {
            System.out.println("KV: " + kv + ", Value: "
                    + Bytes.toString(kv.getValue()));
        {
            n++;

        }
    }
    scanner1.close();

尝试使用所有可能的方法
1. SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("TRANSACTIONS"), Bytes.toBytes("TRANS_ID"), CompareFilter.CompareOp.LESS, new SubstringComparator("5000"));

  1. SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("TRANSACTIONS"), Bytes.toBytes("TRANS_ID"), CompareFilter.CompareOp.LESS, Bytes.toBytes("5000")); 以上方法都不起作用:(
4

3 回答 3

2

这里肯定不存在的一件事是,在创建 FILTERLIST 时,您还必须指定 FilterList.Operator,否则不确定 filterlist 将如何处理多个过滤器。在你的情况下,它应该是这样的: -

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);

看看这是否有帮助。

于 2012-05-03T18:45:19.977 回答
0

看起来不错。检查您是否将它们保留为“1000”和“2000”,而不是 1000 和 2000 的 byte[]。

休息对我来说很好。

于 2012-05-03T12:34:34.413 回答
0

1 FilterList 默认运算符是 Operator.MUST_PASS_ALL。你的代码没关系。
2 如果你把字符串作为字节放在hbase中,你的选择是错误的。
因为“1000”<“2”<“5000”

    Put put = new Put(rowKey_ForTest);
    put.add(ColumnFamilyName, QName1, Bytes.toBytes("2"));
    table.put(put);

    List<Filter> filters = new ArrayList<Filter>();
    SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
            ColumnFamilyName, QName1, CompareOp.GREATER,
            new BinaryComparator(Bytes.toBytes("1000")));
    filters.add(filter1);

    SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
            ColumnFamilyName, QName1, CompareOp.LESS, new BinaryComparator(
                    Bytes.toBytes("5000")));

    filters.add(filter2);

    FilterList filterList = new FilterList(filters);

    Scan scan = new Scan();
    scan.setFilter(filterList);

    List<String> resultRowKeys = new ArrayList<String>();
    ResultScanner resultScanner = table.getScanner(scan);
    for (Result result = resultScanner.next(); result != null; result = resultScanner
            .next()) {
        resultRowKeys.add(Bytes.toString(result.getRow()));
    }
    Util.close(resultScanner);

    Assert.assertEquals(1, resultRowKeys.size());

3 如果你把 int 作为字节,你的代码是错误的。您应该使用 Bytes.toBytes(int),而不是 Bytes.toBytes(String)。

我的测试代码在https://github.com/zhang-xzhi/simplehbase
上面 有很多关于 hbase 的测试。

或者您可以发布您的 put 代码,以便我们检查您是如何将数据保存到 hbase 的。
或者你可以调试它,检查你的值的格式。

看看能不能帮上忙。

于 2014-04-02T16:28:35.283 回答