HBase:获取带有时间戳的行数据请求
HBase: GET request for row data with timestamp
我通过 Java API 创建了一个 HBase table 并通过 Put 添加了数据。我也可以用相应的Get读取Java中的数据。 HBase 文档说单元格值也可以通过使用 GET 请求读取,例如在浏览器中,请参阅 documentation。
以下请求对我有效,returns 整行:
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 提供的解决提示!
我通过 Java API 创建了一个 HBase table 并通过 Put 添加了数据。我也可以用相应的Get读取Java中的数据。 HBase 文档说单元格值也可以通过使用 GET 请求读取,例如在浏览器中,请参阅 documentation。
以下请求对我有效,returns 整行:
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 提供的解决提示!