2016-03-21 13 views
6

整数-17678の値を持つHBASEテーブルを作成しています。しかし、私がpheonixからそれを取得するとき、それは私に異なる正の価値を与えます。 RowKeyは合成の行キーであり、行キーに問題はありません。Phoenixが負の整数値を正しく表示しない

HBaseの挿入:

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

    } 
} 

フェニックス検索:

TESTから

選択CAST(整数として "値")。

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

ここに間違いがありますか?またはフェニックスの問題?

答えて

7

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

バイナリ表現は、(負の値が正の値の前にソートされるように)符号ビットと4バイト整数で反転されます。

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

予想通りこのように出力されている:だからフェニックス形式にHBaseの直列化形式から変換する

。 HBaseを使用してデータを挿入するときは、バイナリ表現に注意する必要があります。

直接HBase to Phoenixの読み取りは、CHARおよびUNSIGNED_ *データ型でのみ可能です。他のデータ型に合わせて適切にシリアル化する必要があります。すなわち、 -17678を挿入する場合は、i = 2147465970を設定してください。

フェニックスを使用してデータを挿入することをおすすめします。アプリケーションの依存関係を維持することを心配している場合、Phoenixは "シン" jdbcドライバ(86MBの代わりに4MB)を提供します。

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


どうしてもHBaseのを使用する必要がある場合は、ビット単位のXORを使用して署名した数値をシリアル化することができます。

整数の場合、iにビットマスクをXORして符号ビットを反転させたいとします。

4バイトの整数に適用するビットマスクです:http://ideone.com/anhgs5から

(10000000000000000000000000000000)2 = (-2147483648)10 

、我々は2147465970を取得します。 Phaseを使用して読むとHBaseを使用して挿入すると、-17678)と表示されます。

Bigint(日付/時刻型の共有ビットマスク)、Smallint、Float、Doubleには別のビットマスクが必要です。

+0

ありがとうございました。だから私はJDBCドライバを使用してクエリ私は正しい値を得ているだろうか?私はフェニックスを使用してデータを挿入したくない、hbaseのクライアントAPIは賭けです。 –

+0

データがPhoenixが予期する形式でシリアル化されていないため、そのまま動作しません。 HBaseを使用してフェニックスが適切にデシリアライズできるデータを挿入する方法の例を使用して回答を更新しました。 – kliew

+0

唯一の回避策は、pheonix自体を使用してデータを挿入することですか? –

関連する問題