查询rowkey后缀部分的Hbase表

查询rowkey后缀部分的Hbase表,hbase,Hbase,我有一个hbase表,它的键是复合键part1\u part2\u part3 现在我想在rowkey的第3部分查询关键字的结果。那么,除了扫描第3部分中的所有行并检查关键字是否存在之外,还有什么最佳的查询方法吗?您是否尝试过使用HBase筛选器?如果没有,您可以将行过滤器与子字符串比较器一起使用来实现这一点。以下是RowFilter的使用方式: public class RowFilterDemo { public static void main(String[] args) th

我有一个hbase表,它的键是复合键part1\u part2\u part3
现在我想在rowkey的第3部分查询关键字的结果。那么,除了扫描第3部分中的所有行并检查关键字是否存在之外,还有什么最佳的查询方法吗?

您是否尝试过使用HBase筛选器?如果没有,您可以将行过滤器子字符串比较器一起使用来实现这一点。以下是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();
    }
}
这将返回其行键包含第3部分的所有行

另一种方法是通过反转行键设计并使用PrefixFilter获取数据来稍微调整行键设计。给定一个在实例化筛选器实例时指定的前缀,与此前缀匹配的所有行都将返回给客户端

在这种情况下,行键将是第3部分\u第2部分\u第1部分。获取数据的代码为:

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()方法执行范围扫描。这将比使用过滤器更有效

更高级的方法是使用HBaseFuzzyRowFilter。但要使用它,您的行键必须具有相同的长度

-除了扫描所有行之外,还有什么最佳的查询方式吗 并检查第3部分中是否存在关键字?

Change your design if possible and use range queries.