Phoenix不会正确显示负整数值

我正在创建一个值为整数-17678的HBASE表。 但是当我从pheonix中检索它时,它给了我一个不同的正值。 RowKey是一个复合rowkey,rowkey没有问题。

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(“Value”AS INTEGER);

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

这里有什么不对吗? 还是凤凰问题?

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

二进制表示是一个4字节整数,符号位翻转(因此负值在正值之前排序)。

所以要从HBase序列化格式转换为Phoenix格式:

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

因此输出符合预期。 使用HBase插入数据时,需要注意二进制表示。

只有CHAR和UNSIGNED_ *数据类型才能使用直接HBase toByte到Phoenix读取。 您必须为其他数据类型进行适当的序列化。 即。 当你的意思是插入-17678时设置i = 2147465970 -17678

我建议使用Phoenix插入数据。 如果您担心让应用程序依赖于依赖项,那么Phoenix提供了一个“瘦”的jdbc驱动程序(4mb而不是86mb)。

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


如果绝对必须使用HBase,则可以使用按位异或序列化已签名的数字。

对于整数,您可能希望使用位掩码对您的i进行异或来翻转符号位。

应用于4字节整数的位掩码是:

 (10000000000000000000000000000000)2 = (-2147483648)10 

来自http://ideone.com/anhgs5 ,我们得到2147465970 。 如果使用HBase插入,当您使用Phoenix阅读时,您将阅读-17678)

对于Bigint(具有日期时间类型的共享位掩码),Smallint,Float和Double,您将需要不同的位掩码。