Hbase MultiRowRangeFilter:如何限制每行范围的结果?

Hbase 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 在上表中,如何执行扫描,使每

我试图利用HBase
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中可能是可行的,稍后我们可能会使用它。