Hbase MultiRowRangeFilter:如何限制每行范围的结果?
我试图利用HBaseHbase MultiRowRangeFilter:如何限制每行范围的结果?,hbase,google-cloud-bigtable,Hbase,Google Cloud Bigtable,我试图利用HBaseMultiRowRangeFilter,以尽量减少重复扫描尝试时到服务器的往返次数。但是,我不知道如何处理一个行范围可能有太多行的情况,这将阻止扫描从其他范围返回任何行 例如,考虑具有以下行键结构和内容的表: 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 在上表中,如何执行扫描,使每
MultiRowRangeFilter
,以尽量减少重复扫描尝试时到服务器的往返次数。但是,我不知道如何处理一个行范围可能有太多行的情况,这将阻止扫描
从其他范围返回任何行
例如,考虑具有以下行键结构和内容的表:
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
在上表中,如何执行扫描
,使每个Bob | ~|
范围最多返回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();
}
private void getRanges(表tbl,最大整数)引发IOException
{
List rowrangeList=新建ArrayList();
对于(整数i=1;iBob | 1将有多少行?如果它没有无限增长,那么也许您可以调整您的模式,使Bob | 1是行键,XXX是列名。然后您可以使用ColumnPaginationFilter将列数限制为2?不幸的是,本机不支持此功能。我的最佳建议是并行发布行范围。这实际上会提高整体延迟,因为单个读取请求中的多个行范围是按顺序处理的
由于每个RPC的开销,使用此路径将略微降低最大吞吐量。但是,如果您在每个范围内返回的行数超过一小部分,则工作将由响应处理主导,因此您不会看到太大的差异。感谢您的建议。不幸的是,我无法以这种方式更改架构,因为可能会有ny Bob | 1行,因此不会是唯一的。但感谢您提出ColumnPaginationFilter——它可能在这里用于其他用途……感谢您的建议。不幸的是,此代码段本来打算在Spark中以工作级别运行(即,在此阶段之后无法进一步并行化).不过,这在Beam中可能是可行的,稍后我们可能会使用它。