2016-03-21 17 views
6

Tworzę tabelę HBASE o wartości liczby całkowitej -17678. Ale kiedy odzyskuję ją z pheonix, daje mi to inną pozytywną wartość. RowKey jest złożonym rowkey i nie ma problemu z rowkey.Phoenix nie wyświetla ujemnych wartości całkowitych poprawnie

HBase wstawiania:

public class test 
{ 
public static void main(String args[]) 
{ 
     Configuration config = HBaseConfiguration.create(); 

      Connection connection = ConnectionFactory.createConnection(config); 
      Table table = connection.getTable(TableName.valueOf("TEST")); 
      Integer i=-17678; 

      try 
      { 
      Put p = new Put(Bytes.toBytes("rowkey")); 
      p.addColumn(Bytes.toBytes("test"),Bytes.toBytes("test"),Bytes.toBytes(i)); 
      table.put(p); 
      } 
      finally 
      { 
      table.close(); 
      connection.close(); 
      } 

    } 
} 

Phoenix pobierania:

wybrać obsada ("wartość" jako liczba całkowita) z testu;

+------------------------------------------+ 
|   TO_INTEGER(test."Value")   | 
+------------------------------------------+ 
| 2147465970        | 
+------------------------------------------+ 

Coś tu nie tak? lub problem z feniksem?

Odpowiedz

7

http://phoenix.apache.org/language/datatypes.html

binarna reprezentacja jest liczbą całkowitą z 4 bajtów bit znaku odwrócony (tak, że ujemne wartości rodzaju przed wartości dodatnich).

więc do konwersji z formatu serializacji HBase do formatu Phoenix:

(-17678)10 = (11111111111111111011101011110010)2 
=> (01111111111111111011101011110010)2 = (2147465970)10 

Dlatego wyjście jest zgodnie z oczekiwaniami. Podczas wstawiania danych za pomocą HBase należy pamiętać o reprezentacji binarnej.

Bezpośredni odczyt od HB do Byte do Phoenix jest możliwy tylko dla typów danych CHAR i UNSIGNED_ *. Będziesz musiał serializować odpowiednio dla innych typów danych. to znaczy. ustawienie i = 2147465970, jeśli chcesz wstawić -17678.

Zalecam używanie Phoenix do wstawiania danych. Jeśli martwisz się o to, że aplikacja będzie świecić na zależnościach, Phoenix oferuje "cienki" sterownik jdbc (4mb zamiast 86mb).

https://phoenix.apache.org/server.html


Jeśli koniecznie musi używać HBase można szeregować podpisany numerów za pomocą XOR bitowe.

Dla liczb całkowitych, chcesz XOR swój i z maską bitową, aby odwrócić bit znaku.

maskę bitową zastosować do Integer 4-bajtowy jest:

(10000000000000000000000000000000)2 = (-2147483648)10 

Od http://ideone.com/anhgs5 otrzymujemy 2147465970. Jeśli wstawisz to za pomocą HBase, podczas czytania za pomocą Phoenix, przeczytasz -17678).

Będziesz potrzebował innej maski bitowej dla Bigint (wspólna maska ​​bitowa z typami daty i czasu), Smallint, Float i Double.

+0

Dzięki. Więc kiedy zapytanie za pomocą sterownika JDBC otrzymam poprawną wartość? Nie chcę wstawiać danych za pomocą phoenix, jest to API klienta hbase. –

+0

Nie będzie działać tak jak jest, ponieważ dane nie były serializowane w formacie oczekiwanym przez Phoenix. Zaktualizowałem swoją odpowiedź przykładem, jak używać HBase do wstawiania danych, które mogą być poprawnie deserializowane przez Phoenix. – kliew

+0

Więc jedynym rozwiązaniem byłoby wstawienie danych przy użyciu samej Pheonix? –

Powiązane problemy