2016-06-23 16 views
0

Ich habe eine HBase-Tabelle über Java API erstellt und Daten über ein Put hinzugefügt. Ich kann die Daten in Java auch mit einem entsprechenden Get lesen. Die HBase-Dokumentation besagt, dass ein Zellenwert auch gelesen werden kann, indem eine GET-Anforderung verwendet wird, z. im Browser, siehe documentation.HBase: GET Anfrage für Zeilendaten mit Zeitstempel

Die folgende Anfrage funktioniert für mich, was die ganze Zeile zurückgibt:

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

Das Ergebnis ist ein xml und sieht folgende:

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

Wenn Sie einen Blick auf die Zeitstempel haben, ist es 1466667016879, aber wenn ich

http://my_hbase_url:12345/dm-table/exampleRow/family:html/1466667016879 

nennen erhalte ich eine not found re sult! Auch der Java-Code funktioniert und gibt mir diesen Zeitstempel:

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); 

diese Drucke:

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

So Zeitstempel vorhanden ist, aber die http-GET-Anforderung nicht mit dem Zeitstempel arbeitet, kann jemand helfen?

+0

Ich schaute hinein, aber ich kann 'Familie: html' nicht verwenden. Ist es nur für HBase 2.0? – Whitefret

+0

Die Spalten-Familie "Familie" und die Spalte "html" sind nur aus meinem Tabellenbeispiel, ich habe die Tabelle mit dieser Struktur erstellt. Ich benutze HDP 2.4 mit HBase 1.1.2 –

+0

Ich bin dumm:/... Ich bekomme eine Datei herunterladen statt eine schöne Xml-Antwort. Werde versuchen, es nochmal zu überprüfen – Whitefret

Antwort

1

Der Zeitstempel in der URL sucht nach dem neuesten Datensatz mit einem EARLIER-Zeitstempel!

haben also einen Blick auf folgendes Beispiel:

Wenn Sie anrufen z.B. http://my_hbase_url:12345/dm-table/exampleRow/family:html Sie erhalten folgendes Ergebnis:

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

Also, wenn Sie das Ergebnis über Zeitstempel erhalten möchten (zB weil Sie verschiedene Versionen der Daten gespeichert haben), können Sie den Zeitstempel an die URL hinzufügen, um die neuesten Daten-Set zu erhalten mit einem früheren Zeitstempel. Also, um das Daten-Set Oben genannt Sie /<timestamp + 1> zur URL hinzufügen:

http://my_hbase_url:12345/dm-table/exampleRow/family:html/1466667016880 

Dies bringt das gleiche Ergebnis wie oben gezeigt. Wenn dies die einzige oder früheste Version ist, würde das Aufrufen von http://my_hbase_url:12345/dm-table/exampleRow/family:html/1466667016879 kein Ergebnis finden und würde in einem not found Ergebnis enden, wie in der obigen Frage beschrieben.

Sie müssen jedoch <timestamp + 1> (oder höher) verwenden, um die erwarteten Daten zu erhalten!

Danke @Whitefret für diesen Lösungshinweis!

+0

Hier ist der Jira Link, der erste Kommentar erklärt das Verhalten. https://issues.apache.org/jira/browse/HBASE-16106 – Whitefret