在Hbase表上查询rowkey的后缀部分

时间:2014-05-13 10:46:25

标签: hbase

我有一个hbase表,其键是复合键part1_part2_part3 现在我想在rowkey的part3上查询关键字的结果。那么除了扫描所有行并检查第3部分中是否存在关键字之外,还有其他任何查询方式吗?

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用 HBase过滤器?如果没有,您可以使用 RowFilter SubstringComparator 来实现此目的。这就是RowFilter的使用方式:

public class RowFilterDemo {

    public static void main(String[] args) throws IOException {

        Configuration conf = HBaseConfiguration.create();
        HTable table = new HTable(conf, "demo_table");
        Scan s = new Scan();
        Filter f = new RowFilter(CompareOp.EQUAL, new SubstringComparator("_part3"));
        s.setFilter(f);
        ResultScanner rs = table.getScanner(s);
        for(Result r : rs){
            for (KeyValue kv : r.raw()){
                System.out.println("RowKey : " + Bytes.toString(r.getRow()));
                System.out.println("Qualifier : " + Bytes.toString(kv.getQualifier()));
                System.out.println("Value : " + Bytes.toString(kv.getValue()));
            }

        }
        rs.close();
        table.close();
    }
}

这将返回rowkey包含 _part3

的所有行

另一种方法可能是通过反转它们并使用 PrefixFilter 来获取数据来略微调整你的rowkey设计。给定在实例化过滤器实例时指定的前缀,将匹配此前缀的所有行返回给客户端。

在这种情况下,rowkey将是 part3_part2_part1 。获取数据的代码将是:

Filter filter = new PrefixFilter(Bytes.toBytes("part3_"));
Scan scan = new Scan();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) {
for (KeyValue kv : result.raw()) { 
    System.out.println("KV: " + kv + ", Value: " + Bytes.toString(kv.getValue())); }
} 
scanner.close();

此方法还可让您使用 Scan.startRow() Scan.stopRow()方法执行范围扫描。这比使用过滤器更有效。

更高级的方法是使用HBase FuzzyRowFilter 。但是为了使用它,你的rowkeys必须是相同的长度

- 除了扫描所有行外,还有其他任何查询方式    并检查第3部分中是否存在关键字?

Change your design if possible and use range queries.

HTH