java - 编写 MapReduce 时 Apache Phoenix 双数据类型问题

标签 java hadoop hbase apache-phoenix

我正在使用 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 将 Double 值作为 ByteArray 存储在 Hbase 中,如下所示

column=CF1:TOTALAMOUNT, timestamp=1434102384451, value=\xC0m@\x00\x00\x00\x00\x01

我编写了 mapreduce 程序来直接从 Hbase SCAN api 读取值,而无需使用 Phoenix,它对 Varchar 值工作正常,但存储为字节数组的其他数据类型返回不同的值。引用 Phoenix 和 mapreduce 输出。所有正 double 值返回为负值,负 double 值返回为 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

最佳答案

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%28double%2Cbyte[]%2Cint%29

关于java - 编写 MapReduce 时 Apache Phoenix 双数据类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30908795/

相关文章:

java - 从类中获取bean id

java - 通过泛型对象类型访问类的方法

java - Neo4J SDN 4 无法保存

r - as(x, class(k)) 错误 : no method or default for coercing “NULL” to “data.frame”

java - 如何在hadoop的reduce中将genericWritable恢复为我的用户定义的Writable?

java - 如何在运行时更改xml中的spring bean属性值?

hadoop - 在哪里可以找到CDH及其所有软件版本?

java - 使用 MapReduce 将数据批量插入 HBase

hadoop - DataProc MapReduce 停止工作

Java:连接到 Hbase 0.94.1 时出现异常