如何扫描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 操作。显然,这种方法比一次扫描效率低得多,但它可以让您无需数据转换即可获得所需的所有数据。
我在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 操作。显然,这种方法比一次扫描效率低得多,但它可以让您无需数据转换即可获得所需的所有数据。