3

我需要在 HBase 中使用 Scan 来扫描满足特定条件的所有行:这就是我将使用过滤器的原因(实际上是一个包含两个 SingleColumnValueFilter 的复合过滤器列表)。现在,我的 rowKeys 以这种方式构建:

a.b.x|1|1252525  
a.b.x|1|2373273  
a.b.x|1|2999238  
...  
a.b.x|2|3000320  
a.b.x|2|4000023  
...  
a.b.y|1|1202002  
a.b.y|1|1778949  
a.b.y|1|2738273  

作为附加要求,我只需要迭代那些 rowKey 以“abx|1”开头的行

现在,问题

  1. 如果我在过滤器列表中使用额外的 PrefixFilter,扫描仪是否总是扫描所有行(并且在每个行上都应用过滤器)?
  2. 如果我通过 startRow(前缀)和过滤器列表(没有 PrefixFilter)实例化扫描,我知道扫描从给定的行前缀开始。那么,假设我使用“abx”作为 startRow,扫描是否也会扫描 aby?
  3. 如果我使用 new Scan(startRow, endRow) 然后 setFilter 会有什么行为?总而言之:缺少的构造函数 Scan(byte [] start, byte [] end, Filter filter) 呢?

在此先感
谢安德里亚

4

1 回答 1

2

行键在 hbase 中排序(词法)。因此,所有“abx|1”都将出现在“abx|2”之前,依此类推。由于行键存储为字节数组并按字典顺序排序,因此请注意非固定长度的行键以及在混淆时不同的字符类别。但是对于您的要求,这条线上的东西应该可以工作:

Scan scan = new Scan(Bytes.toBytes("a.b.x|1"),Bytes.toBytes("a.b.x|2"); //creating a scan object with start and stop row keys

scan.setFilter(colFilter);//set the Column filters you have to this scan object.

//And then you can get a scanner object and iterate through your results
ResultScanner scanner = table.getScanner(scan);
for (Result result = scanner.next(); result != null; result = scanner.next())
{
    //Use the result object
}

更新: ToBytes 应该是 toBytes

于 2012-11-01T18:33:44.247 回答