【问题标题】:HBase: GET request for row data with timestampHBase:获取带有时间戳的行数据的请求
【发布时间】:2016-06-27 14:46:34
【问题描述】:

我通过 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 请求无法使用时间戳,有人可以帮忙吗?

【问题讨论】:

  • 我查看了它,但我无法使用 family:html。是否仅适用于 HBase 2.0?
  • 列家族“family”和列“html”只是来自我的表格示例,我用这种结构创建了表格。我使用 HDP 2.4 和 HBase 1.1.2
  • 我很笨 :/... 我要下载一个文件而不是有一个很好的 Xml 答案。将尝试再次调查它
  • 好的,重现了同样的错误,可能有关于它的 JIRA。你的 HBase 版本是多少?
  • 这绝对是一个错误,尝试在同一行/列上放置,并查询当前时间戳。您是否还获得了以前的数据而不是当前数据?

标签: hadoop timestamp hbase http-get


【解决方案1】:

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 以获取具有较早时间戳的最新数据集。因此,要获得上面显示的数据集,您必须将 /&lt;timestamp + 1&gt; 添加到 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 结果结束,如上述问题中所述。

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

感谢@Whitefret 的解决提示!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2012-08-07
  • 2021-12-27
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多