2016-06-29 9 views
0

Ich habe eine Reihe Schlüssel, wie dieseHbase byteArray nach Long

Put put = new Put(Bytes.toBytes(tweets.getContact_Unique_Id()+"^"+Bytes.toBytes(epoch))); 

wird erstellt Wo Epoche der langen Zeitstempel ist.

Nun, wenn ich scannen erhalte ich eine Zeile als

3857^[B @ 7c8f4424

Nun wünsche ich den Teil von RowKey dh Long

umwandeln [ B @ 7c8f4424

Wie erreiche ich das?

EDIT -> Wenn ich die Put als

Put setzen = new Put (Bytes.toBytes (tweets.getContact_Unique_Id() + "^" + Epoche);

Nicht werden alle Zeilen eingefügt, aber wenn ich

Put setzen = new put (Bytes.toBytes (tweets.getContact_Unique_Id() + "^" + Bytes.toBytes (Epoche)));

Alle Zeilen werden eingefügt, bitte beachten Sie, dass alle Zeitwerte unterschiedlich sind.

Außerdem habe ich "^" verwendet, um den ersten und zweiten Teil des Zeilenschlüssels zu trennen.

Dank

+0

zu bearbeiten: was es bedeutet, "nicht alle Zeilen eingefügt werden"? Ausnahmen beim Schreiben? nichts, um Zeile für Zeile zu bekommen? Haben Sie überprüft, dass alle Schlüssel eindeutig sind? –

+0

Ja alle Zeilen sollten eindeutig sein, da es verschiedene Zeitstempel gibt, es gibt keine Ausnahmen, ich habe auch System.currentTimeMillis(); und dann die Epoche jedes Mal vor dem Einfügen inkrementieren, aber mit dem Put put = new Put (Bytes.toBytes (Tweets.getContact_Unique_Id() + "^" + Epoche); , nicht alle Reihen sind irgendwie einzigartig, aber der Put, den ich in meiner Frage verwendet habe, funktioniert es, aber jetzt kann ich den ursprünglichen langen Zeitstempel nicht abrufen –

+0

schnelle Lösung: byte [] epoBytes = Bytes.toBytes (epoch); Setzen Sie put = new Put (Bytes.add (Bytes.toBytes (tweets.getContact_Unique_Id() + "^" + epoBytes), epoBytes)); die bessere Lösung ist es, genauer mit der aktuellen Zeit umzugehen. Ich habe keinen vollständigen Code, daher kann ich Ihnen keinen genaueren Rat geben. –

Antwort

1

Sie speichern Ihre Long-Wert in einen falschen Weg!

Denn wenn Sie + Array mit Bytes des Long-Wert in einen String konvertiert, zeigt der konvertierte Wert die aktuelle Adresse im Speicher des Bytes Array, nicht seine Wert!


Die richtige Art und Weise des Sparens:

Put put = new Put(Bytes.add(Bytes.toBytes(tweets.getContact_Unique_Id() + "^"), Bytes.toBytes(epoch))); //I kept "^", don't know why you need it 

und Abrufen:

// row is the byte array of your key 
// Bytes.tail(..) gets tail of key's bytes with bytes of your long 
// Bytes.toLong(..) converts long bytes to long 
// 8 corresponds to long size in bytes 
Bytes.toLong(Bytes.tail(row, 8)) 
+0

byte [] bit = "[B @ 40dea6bc" .getBytes(); System.out.println (Bytes.toLong (Bytes.tail (Bit, 8))); Dies gibt kein korrektes Ergebnis –

+1

In Java 8 können Sie 'Long.BYTES' anstelle von 8 verwenden. –

+0

Im mit Java 7 –