如何扫描hbase中的数字范围

How to scan a numeric range in hbase

我在hbase中的行键是不同长度的数字,比如1,2,3.....32423480, 32423481..

当我使用

scan 'table' {STARTROW => '1', ENDROW => '3'}  

扫描 table,我只想要行键为 1、2、3 的结果,但它 returns 以 1、2、3 开头的所有行,如 1003423, 200034..

是否可以使用 hbase shell 或 java api 以数字方式过滤行键范围?

谢谢

我更熟悉 Apache Accumulo(另一个 BigTable 实现),但我相信 HBase 的操作类似。

键按字典顺序排序,因此您观察到“11”排在“2”之前。通常,您所做的是格式化键以强制排序在您的域中有意义。因此,例如,如果您的键最大值为 99999,则最多可以填充 5 个字符。

1  becomes 00001
2  becomes 00002
11 becomes 00011
etc

这样 HBase 将根据预期的数字顺序对您的键进行排序,您可以扫描 (00001, 00003) 之类的范围。

看起来您在 HBase table 中的键存储为字符串。这意味着像 1、2、3 等数字位于 table 的不同部分,并且它们之间还有许多其他键。所以你的问题的答案是:在唯一的扫描操作的帮助下,不可能扫描你想要的数字范围。

但是您有两种可能的方法来解决您的问题:

1) 更改密钥的架构。只需将您的密钥转换为整数并将它们存储在 HBase 中。这样,您的键将存储为 4 个元素的字节数组(如果您使用长整数,则为 8 个元素)并在 HBase 中以数字方式精确排序。此模式内存效率高,但不 shell 友好,因为在 HBase shell 中,默认情况下您只能键入字符串表示的键。如果您想要 shell 友好但内存效率不高的方式,您可以使用 jeff 的回答中提供的解决方案。

2) 如果您不想将所有数据移动到新的密钥模式,那么您可以使用 Get operations instead of Scan。只需为范围内的每个元素调用 get 操作。显然,这种方法比一次扫描效率低得多,但它可以让您无需数据转换即可获得所需的所有数据。