在开始和结束时间之间扫描rowkeys

时间:2014-01-02 12:43:31

标签: hbase

我有一个hbase表,其中rowkey模式是{id1},{id2},{millisec},我需要获取start和end millisec之间的所有rowkeys,保持id1或id2不变,我如何在hbase中完成?我正在使用java客户端。

谢谢

2 个答案:

答案 0 :(得分:2)

<强>一个。对于已知的{id1}

您必须执行扫描并提供开始和放大停止行。看一下从HBase reference guide

中提取的这个示例
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!
}

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

<强>湾对于已知{id2}

避免全表扫描的唯一方法是实现二级索引(我不是最新的),或者使用经典数据冗余并将相同的数据也存储为{id2},{id1 },{millisec}(根据您的需要,您可以避免一些数据),作为二级索引。

如果您无法负担上述任何一项,您将需要扫描整个表格。要加快扫描速度,您可以:

  1. 使用setTimeRange(long minStamp, long maxStamp)
  2. 使用custom filterfilterRowKey(byte[] buffer, int offset, int length)方法忽略对不需要的行的进一步处理(每行没有{id2}或者时间戳不在范围内)。
  3. 使用FuzzyRowFilter建议的here
  4. 最好的方法取决于您的需求和数据,我会去实现一个自定义过滤器,考虑到行键的固定宽度,它可以为您提供良好的性能。如果还不够,我会选择数据冗余。

答案 1 :(得分:0)

您可以使用Scan

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