在 HBase 中使用带有起始行、结束行和过滤器的扫描

Posted

技术标签:

【中文标题】在 HBase 中使用带有起始行、结束行和过滤器的扫描【英文标题】:Using Scan in HBase with start row, end row and a filter 【发布时间】:2012-08-23 07:52:55 【问题描述】:

我需要在 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 以“a.b.x|1”开头的行

现在,问题

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

提前致谢 安德里亚

【问题讨论】:

【参考方案1】:

行键在 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

【讨论】:

感谢您的回复,但我认为这并不能回答我的问题。我的意思是,我知道字典顺序和扫描问题,我的代码正在运行,没关系。我的问题是关于如何在内部执行扫描(请参阅三个问题)。无论如何,非常感谢你

以上是关于在 HBase 中使用带有起始行、结束行和过滤器的扫描的主要内容,如果未能解决你的问题,请参考以下文章

linux 如何查看某个文本内 包含某个字段的最后十行

如何使用 VBSCript 在 Excel 中查找合并单元格的开始行和结束行?

HTTP报文

HTTP报文

在pyqt QTreeView中选择行和列

使用 Java 在 Hbase 中使用过滤器获取固定行