【问题标题】:How to scan a numeric range in hbase如何扫描hbase中的数字范围
【发布时间】:2017-03-22 16:16:33
【问题描述】:

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

当我使用时

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

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

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

谢谢

【问题讨论】:

    标签: java hadoop hbase


    【解决方案1】:

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

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

    1  becomes 00001
    2  becomes 00002
    11 becomes 00011
    etc
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多