【发布时间】:2018-07-27 10:16:26
【问题描述】:
我正在尝试利用 HBase MultiRowRangeFilter 来最大程度地减少重复扫描尝试到服务器的往返次数。但是,我不知道如何处理一个 Row Range 可能有太多行的情况,这会阻止 Scan 从其他范围返回任何行。
例如,考虑具有以下 Row Key 结构和内容的表:
Bob|1|XXX (XXX is some random sequence)
Bob|1|XXX
Bob|1|XXX
Bob|2|XXX
Bob|2|XXX
Bob|2|XXX
Bob|3|XXX
Bob|3|XXX
Bob|3|XXX
我如何在上表中执行Scan,它会在Bob|~| 的每个范围内返回 MAXIMUM 2 行?
现在虚拟代码看起来像这样:
private void getRanges(Table tbl, Integer max) throws IOException
{
List<RowRange> rowrangeList = new ArrayList<RowRange>();
for (Integer i = 1; i <= 3; i++)
{
String rowKey = "Bob|" + i;
RowRange rowRange = new RowRange(rowKey.getBytes(), true, rowKey.getBytes(), true);
rowrangeList.add(rowRange);
}
FilterList fList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
fList.addFilter(new KeyOnlyFilter());
fList.addFilter(new FirstKeyOnlyFilter());
fList.addFilter(new PageFilter(max));
fList.addFilter(new MultiRowRangeFilter(rowrangeList));
Scan s = new Scan();
s.setFilter(fList);
ResultScanner scanner = tbl.getScanner(s);
for (Result row : scanner)
{
System.out.println("Got row: " + new String(row.getRow()));
}
scanner.close();
}
但这里有问题:
如果我们不指定max 数字并在FilterList 中省略设置PageFilter(max),这将起作用。我们可以在客户端过滤结果,但表可能有数百万行带有Bob... 行键前缀,因此我们希望在服务器端限制Scan 的结果。
如果我们指定PageFilter(max),那么如果表的行数多于max,前缀为Bob|1|,那么我们将不会返回任何前缀为Bob|2|等的行。
我们怎样才能最好地做到这一点?同样,目标是一次为多个范围执行一个Scan(以改进当前为每个子键执行重复Scans 的功能,这似乎效率低下)。理想情况下,这应该适用于 HBase 和 Bigtable,但至少其中一个会有所帮助!
【问题讨论】:
标签: hbase google-cloud-bigtable