2016-06-23 6 views
0

Я создал таблицу HBase через API Java и добавил данные через Put. Я также могу прочитать данные на Java с соответствующим Get. В документации по HBase говорится, что значение ячейки также может быть прочитано с использованием запроса GET, например. в браузере, см. documentation.HBase: запрос GET для данных строки с отметкой времени

Следующая запрос работает для меня, которая возвращает всю строку:

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 ре Sult! Кроме того, код 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> 

Так метка времени существует, но запрос GET по HTTP не будет работать с отметкой времени, может кто-то помочь?

+0

Я изучил его, но я не могу использовать 'family: html'. Это только для HBase 2.0? – Whitefret

+0

«familiy» и «html» столбца являются только из моего примера таблицы, я создал таблицу с этой структурой. Я использую HDP 2.4 с HBase 1.1.2 –

+0

Я тупой:/... Я получаю, чтобы загрузить файл вместо того, чтобы иметь хороший ответ Xml. WIll попытаться заглянуть в него снова – Whitefret

ответ

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, чтобы получить последний набор данных с более ранней меткой времени. Таким образом, чтобы получить данные посаженные показано выше, вы должны добавить /<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 за этот решающий намек!

+0

вот ссылка на jira, первый комментарий объясняет поведение. https://issues.apache.org/jira/browse/HBASE-16106 – Whitefret