Hbase 在开始和结束时间之间扫描行键

Hbase 在开始和结束时间之间扫描行键,hbase,Hbase,我有一个hbase表,其中rowkey模式是{id1}、{id2}、{millisec},我需要获取开始和结束毫秒之间的所有rowkey,保持id1或id2不变,我如何在hbase中实现?我使用的是java客户机 谢谢您可以使用 setTimeRange方法可以很好地满足您的需求 public Scan setTimeRange(long minStamp, long maxStamp) throws IOException G

我有一个hbase表,其中rowkey模式是{id1}、{id2}、{millisec},我需要获取开始和结束毫秒之间的所有rowkey,保持id1或id2不变,我如何在hbase中实现?我使用的是java客户机

谢谢

您可以使用

setTimeRange方法可以很好地满足您的需求

public Scan setTimeRange(long minStamp,
                long maxStamp)
                  throws IOException
Get versions of columns only within the specified timestamp range, [minStamp, maxStamp). Note, default maximum versions to return is 1. If your time range spans more than one version and you want all versions returned, up the number of versions beyond the defaut.
Parameters:
minStamp - minimum timestamp value, inclusive
maxStamp - maximum timestamp value, exclusive
Returns:
this
Throws:
IOException - if invalid time range

a。对于已知的{id1}

您必须执行扫描并提供开始和停止行。请看以下从中提取的示例:

此外,您可以使用
setTimeRange(long minStamp,long maxStamp)
根据时间戳丢弃行

b。对于已知的{id2}

避免完整表扫描的唯一方法是实现一个辅助索引(我不是最新的),或者使用经典的数据冗余,并将相同的数据存储为{id2}、{id1}、{millisec}(取决于您的需要,您可以避免一些数据),它充当辅助索引

如果您负担不起以上任何一项,您必须扫描整个表。要加快扫描速度,您可以:

  • 使用
    设置时间范围(long minStamp,long maxStamp)
  • 使用带有
    filterRowKey(byte[]buffer,int offset,int length)
    方法忽略对不需要的行(没有{id2}或时间戳不在范围内的每一行)的进一步处理
  • 使用建议的模糊过滤器

  • 最好的方法取决于您的需求和数据,我将实现一个定制过滤器,它可以在固定行键宽度的情况下为您提供良好的性能。如果这还不够,我会选择数据冗余。

    谢谢你的回答。为了进行扫描(不进行全表扫描),我需要了解表中必须存在的开始行和停止行,因为这是时间序列数据,包含毫秒,我如何确定开始键和结束键,或者扫描不要求表中存在开始键和停止键?这就是问题所在,启动和停止键不需要存在,它们只是边界。您可以使用id1键作为起点,id1+1键作为停止点。
    public static final byte[] CF = "cf".getBytes();
    public static final byte[] ATTR = "attr".getBytes();
    ...
    
    HTable htable = ...      // instantiate HTable
    
    Scan scan = new Scan();
    scan.addColumn(CF, ATTR);
    scan.setStartRow(Bytes.toBytes("row")); // start key is inclusive
    scan.setStopRow(Bytes.toBytes("rox"));  // stop key is exclusive
    ResultScanner rs = htable.getScanner(scan);
    try {
      for (Result r = rs.next(); r != null; r = rs.next()) {
      // process result...
    } finally {
      rs.close();  // always close the ResultScanner!
    }