Vig*_*h I 6 java serialization hadoop hbase 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
凤凰检索:
从TEST中选择CAST("Value"AS INTEGER);
+------------------------------------------+
| TO_INTEGER(test."Value") |
+------------------------------------------+
| 2147465970 |
+------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
这里有什么不对吗?还是凤凰问题?
http://phoenix.apache.org/language/datatypes.html
二进制表示是一个4字节整数,符号位翻转(因此负值在正值之前排序).
所以要从HBase序列化格式转换为Phoenix格式:
(-17678)10 = (11111111111111111011101011110010)2
=> (01111111111111111011101011110010)2 = (2147465970)10
Run Code Online (Sandbox Code Playgroud)
因此输出符合预期.使用HBase插入数据时需要注意二进制表示.
只有CHAR和UNSIGNED_*数据类型才能使用直接HBase toByte到Phoenix读取.您必须为其他数据类型进行适当的序列化.即.设置i = 2147465970何时插入-17678.
我建议使用Phoenix插入数据.如果您担心让应用程序依赖于依赖项,那么Phoenix提供了一个"瘦"的jdbc驱动程序(4mb而不是86mb).
https://phoenix.apache.org/server.html
如果绝对必须使用HBase,则可以使用按位异或序列化有符号数字.
对于整数,您可能希望i使用位掩码对XOR进行异或来翻转符号位.
应用于4字节整数的位掩码是:
(10000000000000000000000000000000)2 = (-2147483648)10
Run Code Online (Sandbox Code Playgroud)
从http://ideone.com/anhgs5,我们得到2147465970.如果您使用HBase插入,当您使用Phoenix阅读时,您将阅读-17678).
对于Bigint(具有日期时间类型的共享位掩码),Smallint,Float和Double,您将需要不同的位掩码.
| 归档时间: |
|
| 查看次数: |
795 次 |
| 最近记录: |