在 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 中使用带有起始行、结束行和过滤器的扫描的主要内容,如果未能解决你的问题,请参考以下文章