我正在使用 Apache Phoenix 在 Hbase 中创建表,因为它提供了二级索引功能以及类似 sql 的数据类型。我使用 phoenix 创建了一个表,其列为 Double 和 Varchar。
CREATE TABLE INVOICE (ROWKEY VARCHAR NOT NULL PRIMARY KEY, CF1.INVOICEID VARCHAR, CF1.TOTALAMOUNT DOUBLE,CF1.STATUS VARCHAR,CF1.CREATEDATE DATE);
Phoenix 在 Hbase 中将 Double 值存储为 ByteArray,如下所示
column=CF1:TOTALAMOUNT, timestamp=1434102384451, value=\xC0m@\x00\x00\x00\x00\x01
我编写了 mapreduce 程序来直接从 Hbase SCAN api 读取值,而不使用 Phoenix,它对 Varchar 值工作正常,但存储为 Byte 数组的其他数据类型返回不同的值。参考 Phoenix 和 mapreduce 输出。所有正双精度值作为负值返回,负双精度值返回为 0.018310546875,如下所示
public void map(ImmutableBytesWritable key, Result value, Context context)
throws IOException, InterruptedException {
Double Val = Bytes.toDouble(value.getValue(CF.TOTALAMOUNT)
context.write(key, new Text(val));
}
-
AQIMPNEW_12345689_SQ123,-100.00000000000001
aqipm2037|4567899,0.018310546875,
aqipm2047|456789,-4.9E-324,
Phoenix Output :
| TOTALAMOUNT |
| 100.0 |
| -234.0 |
| 0.0