我使用ApachePhoenix在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中存储双值,如下所示
column=CF1:TOTALAMOUNT, timestamp=1434102384451, value=\xC0m@\x00\x00\x00\x00\x01
我编写了mapreduce程序来直接从hbase scan api读取值,而不使用phoenix,它对于varchar值工作正常,但是其他存储为字节数组的数据类型返回不同的值。参考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
1条答案
按热度按时间bf1o4zei1#
phoenix使用不同的转换方案将数据类型存储到hbase中。当您使用phoenix获取数据时,它将使用相同的转换方案对数据进行解码并显示给您。因此,不要试图直接从mr代码连接hbase,而是使用phoenix-map-reduce集成。
参考:https://phoenix.apache.org/phoenix_mr.html
但是,如果您仍然希望直接连接到hbase,则必须使用phoenix使用的相同编码器和解码器。
请参阅此类“org.apache.phoenix.schema.pdatatype”:http://grepcode.com/file/repo1.maven.org/maven2/org.apache.phoenix/phoenix/2.2.3-incubating/org/apache/phoenix/schema/pdatatype.java#pdatatype.basecodec.encodedouble%28双%2cbyte[]%2cint%29