我通过Java API创建了一个HBase表,并通过Put添加了数据。我还可以使用相应的Get读取Java中的数据。 HBase文档说,单元格值也可以通过使用GET请求读取,例如在浏览器中,请参阅documentation

以下请求对我有用,它将返回整行:

http://my_hbase_url:12345/dm-table/exampleRow/family:html?v=1

结果是一个xml,看起来如下:
<CellSet>
  <Row key="ZXhhbXBsZVJvdw==">
    <Cell column="ZmFtaWx5Omh0bWw=" timestamp="1466667016879">PGh0bWw+Li4uTXkgSFRNTC4uLjwvaHRtbD4=</Cell>
  </Row>
</CellSet>

如果您看一下时间戳,它是1466667016879,但是当我打电话时
http://my_hbase_url:12345/dm-table/exampleRow/family:html/1466667016879

我得到一个not found结果! Java代码也可以使用,并提供了以下时间戳:
HTable table = new HTable(config, TABLE_NAME.getBytes());

Get g = new Get("exampleRow".getBytes());
g.setTimeStamp(1466667016879L);

Result r = table.get(g);
System.out.println("Timestamp: " + r.rawCells()[0].getTimestamp());

byte[] value = r.getValue(CF_DEFAULT.getBytes(), "html".getBytes());
String valueStr = new String(value);
System.out.println("GET: " + valueStr);

打印:
Timestamp: 1466667016879
GET: <html>...My HTML...</html>

因此时间戳确实存在,但是http GET请求不能与时间戳一起使用,有人可以帮忙吗?

最佳答案

URL中的时间戳会寻找带有EARLIER时间戳的最新数据集!

因此,请看以下示例:

当您致电例如http://my_hbase_url:12345/dm-table/exampleRow/family:html您得到以下结果:

<CellSet>
  <Row key="ZXhhbXBsZVJvdw==">
    <Cell column="ZmFtaWx5Omh0bWw=" timestamp="1466667016879">PGh0bWw+Li4uTXkgSFRNTC4uLjwvaHRtbD4=</Cell>
  </Row>
</CellSet>

因此,如果您想通过时间戳获取此结果(例如,因为保存了不同版本的数据),则可以将时间戳添加到URL,以获取具有更早时间戳的最新数据集。因此,要获取上面显示的数据集,必须将/<timestamp + 1>添加到URL:
http://my_hbase_url:12345/dm-table/exampleRow/family:html/1466667016880

这带来了与上面所示相同的结果。如果这是唯一或最早的版本,则如上面的问题所述,调用http://my_hbase_url:12345/dm-table/exampleRow/family:html/1466667016879将找不到任何结果,并且将以not found结果结尾。

但是,您必须使用<timestamp + 1>(或更高版本)才能获得预期的数据!

谢谢@Whitefret提供的解决提示!

关于hadoop - HBase:GET请求带有时间戳的行数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37985426/

10-16 02:59