2017-01-04 2 views
0

Werte Ich verwende Hbase API Setzen Sie einen langen Datentyp Hbase mit dem folgenden CodeHBase Java-API zu schreiben, lange statt Hexadezimal

p.add(Bytes.toBytes(this.hcol_fam_n), Bytes.toBytes(this.hcol_qual_n), Bytes.toBytes(this.newoffset)); 

zu schreiben, wenn ich einen Scan-Befehl auf Hbase Shell ausgeführt, die Werte in hex-Format von binären Darstellung angezeigt

value=\x00\x00\x00\x00\x00\x00\x00\x07 

Aber wenn ich legte Anweisung von Hbase Shell verwenden, zeigt es richtig als „7“. Warum ist dieser Unterschied? Und gibt es eine Möglichkeit, den Wert zu schreiben, ohne Bytes.toBytes zu verwenden, um in Hbase zu schreiben, damit ich den Wert ordnungsgemäß von Hbase-Shell sehen kann?

Wenn es keine andere Möglichkeit gibt, den Wert in lesbarer Form in der HBase-Shell zu schreiben, wie kann man hier das Java Bytes.toString für diese Spalte in der scan-Anweisung aufrufen?

Und wenn ich den gleichen Wert lesen mit Hbase API, ich bin nicht in der Lage Wert von Bytes in String zu konvertieren Bytes.toString(value)

Das gibt mir Null-String verwenden. Aber der gleiche Wert wird in Long konvertiert mit Bytes.toLong(value)

Kann mir bitte jemand helfen zu verstehen, warum dies nicht zu String, sondern zu Long konvertiert?

+1

"Aber wenn ich Put-Anweisung von Hbase Shell verwenden", indem Sie das sagen, was ist Ihre Aussage? –

Antwort

1

HBase speichert alle Werte als Bytearrays und speichert keine Metadaten darüber, was der Typ Ihrer Daten ist. Wenn Sie also einen Wert vom Typ Long setzen, konvertiert er den Wert in seine Bytedarstellung und schreibt die Bytes in die Zelle.

Wenn Sie einen Scan in der Shell ausführen, versucht es am besten, Ihnen Ihre Daten zu zeigen, aber es weiß nicht, welchen Typ Ihre Daten haben. Es zeigt also die Bytes als Zeichen an, aber wenn ein Byte ein Steuerzeichen ist, zeigt es seine hexadezimale Darstellung an, anstatt Müll in der Konsole anzuzeigen. Und wenn Sie die Daten mit Bytes.toString bekommen, weiß es nicht, welche Art von Daten in der Zelle ist und macht nur new String(bytes).

Sie haben zwei Möglichkeiten:

  • Ihre Daten in String konvertieren, bevor zu HBase setzen: p.add(colFamily, qualifier, Bytes.toBytes(Long.toString(this.newoffset))); und wenn es zurück konvertieren von String zu lange zu lesen. Dies erhöht den Aufwand für jedes Lesen/Schreiben und verbraucht mehr Speicherplatz, aber Sie haben alle Ihre Daten in der Shell lesbar.
  • Setzen Sie Ihren Long-Wert direkt wie Sie es jetzt tun und lesen Sie es mit Bytes.toLong zurück. Auf diese Weise verbrauchen Ihre Daten im Allgemeinen weniger Speicherplatz (immer 8 Bytes pro Wert statt bis zu 20) und sind schneller zu lesen und zu schreiben, aber Sie sehen immer noch ihre hexadezimale Darstellung in der HBase-Shell.
0

Der beste Weg, Weg, dies zu handhaben ist, die ganze Zahl in Zeichenfolge konvertieren, bevor es zu hbase.I hatte dasselbe Problem und löste dies in scala speichern, wie nachfolgend beschrieben: new String (data.toString) .getBytes()