如何扫描hbase中的数值范围

时间:2016-11-08 21:51:49

标签: java hadoop hbase

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

当我使用

  this.dropzone = new Dropzone('#my-dropzone', {
    autoProcessQueue: false,
  });
  return this.dropzone.on('addedfile', (function(_this) {
    return function(file) {

      var IMAGE_EXTENSIONS, ext;
      IMAGE_EXTENSIONS = 'png jpg jpeg gif'.split(' ');
      ext = (_.last(file.name.split('.'))).toLowerCase();

      if (_.include(IMAGE_EXTENSIONS, ext)) {
        return console.log('IMAGE!');
      } else {

        return setTimeout(function() { // HERE!!!!!!!!!!!!!!!!!!!!
          return _this.dropzone.processQueue();
        }, 10);
      }
    };
  })(this));

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

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

由于

2 个答案:

答案 0 :(得分:4)

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

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

1  becomes 00001
2  becomes 00002
11 becomes 00011
etc

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

答案 1 :(得分:2)

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

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

1)更改密钥的架构。只需将您的密钥转换为整数并将其存储在HBase中。这样,您的密钥将存储为4个元素的字节数组(如果使用长整数,则存储为8个元素),并以完全数字方式在HBase中进行排序。此模式具有内存效率,但不具有外壳友好性,因为在HBase shell中,默认情况下只能键入字符串表示的键。如果你想要外壳友好但不那么节省内存的方式,你可以使用杰夫答案中提供的解决方案。

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