在HBase中使用Scan,包括起始行,结束行和过滤器

时间:2012-08-23 07:52:55

标签: java hbase database-scan

我需要使用HBase中的扫描来扫描符合特定条件的所有行:这就是我将使用过滤器的原因(实际上是包含两个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  

作为附加要求,我只需要迭代那些具有以“a.b.x | 1”开头的rowKey的行

现在,问题

  1. 如果我在我的过滤器列表中使用额外的PrefixFilter,扫描程序是否总是扫描所有行(并且每个行都应用过滤器)?
  2. 如果我实例化Scan传递startRow(前缀)和filterlist(没有PrefixFilter),我理解扫描从给定的行前缀开始。所以,假设我使用的是“a.b.x”。作为startRow,扫描是否也会扫描a.b.y?
  3. 如果我使用新的Scan(startRow,endRow)然后使用setFilter会有什么行为?换句话说:缺少的构造函数Scan(byte [] start,byte [] end,Filter filter)怎么样?
  4. 提前致谢
    安德莉亚

1 个答案:

答案 0 :(得分:2)

行键在hbase中排序(词法)。因此所有“a.b.x | 1”都将出现在“a.b.x | 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