2016-11-08 101 views
4

在HBase的我行重点是与不同长度的数字,如1,2,3 ..... 32423480,32423481 ..如何扫描HBase的数值范围

当我使用

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

扫描表,我只想要结果与行键1,2,3,但它返回所有以1,2,3开头的行,如1003423,200034 ..

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

感谢

回答

1

看起来您的HBase表中的键存储为字符串。这意味着像1,2,3等数字位于表格的不同部分,并且它们之间还有许多其他键。因此,您的问题的答案是:只有一次扫描操作才能扫描您想要的数字范围。

但是,你有两种可能的方式来解决问题:

1)更改按键的模式。只需将您的密钥转换为整数并将它们存储在HBase中即可。这样你的密钥将被存储为4个元素的字节数组(如果使用长整数,则为8个元素),并以数字方式在HBase中进行排序。该模式具有内存高效性,但不是shell友好的,因为在HBase shell中,默认情况下只能键入表示键的字符串。如果你想使用shell而不是内存有效的方式,你可以使用jeff的答案中提供的解决方案。

2)如果您不想将所有数据移动到新的关键架构,则可以使用Get而不是Scan。只需调用你的范围内每个元素的get操作。显然这种方法的效率远低于一次扫描,但它可以让你在没有数据转换的情况下获得所有你想要的数据。

3

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

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

1 becomes 00001 
2 becomes 00002 
11 becomes 00011 
etc 

这样HBase的将按照预期的数字排序的键进行排序,你可以扫描像(00001,00003)的范围。