[英]How to scan a numeric range in hbase
我在hbase中的行键是不同长度的数字,如1,2,3 ..... 32423480,32423481 ..
我用的时候
scan 'table' {STARTROW => '1', ENDROW => '3'}
扫描表,我只想要行1,2,3的结果,但它返回所有以1,2,3开头的行,如1003423,200034 ..
是否可以使用数字方式过滤行键范围使用hbase shell或java api?
谢谢
我更熟悉Apache Accumulo(另一个BigTable实现),但我相信HBase的运行方式类似。
键按字典顺序排序,因此您在'2'之前观察到'11'排序。 通常,您所做的是格式化键以强制排序在您的域中有意义。 因此,例如,如果您的键最大值为99999,则最多可以填充5个字符。
1 becomes 00001
2 becomes 00002
11 becomes 00011
etc
这样HBase将根据预期的数字排序对您的键进行排序,您可以扫描像(00001,00003)这样的范围。
看起来你的HBase表中的键存储为字符串。 这意味着像1,2,3等数字位于表的不同部分,并且它们之间还有许多其他键。 所以问题的答案是:在单一扫描操作的帮助下,无法扫描所需的数值范围。
但是您有两种可能的方法来解决您的问题:
1)更改密钥的架构。 只需将您的密钥转换为整数并将其存储在HBase中。 这样,您的密钥将存储为4个元素的字节数组(如果使用长整数,则存储为8个元素),并以完全数字方式在HBase中进行排序。 此模式具有内存效率,但不支持shell,因为在HBase shell中,默认情况下只能键入字符串表示的键。 如果你想要外壳友好但不是那么有效的内存方式,你可以使用jeff答案中提供的解决方案。
2)如果您不想将所有数据移动到新的密钥架构,则可以使用Get操作而不是Scan 。 只需为您范围内的每个元素调用get操作。 显然,这种方法比一次扫描效率低得多,但它可以让您在没有数据转换的情况下获得所需的所有数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.