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