0

Apache Phoenix を使用して Hbase にテーブルを作成しています。これは、セカンダリ インデックス機能と SQL のようなデータ型を提供するためです。Double と Varchar の両方の列を持つ phoenix を使用してテーブルを作成しました。

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

Phoenix を使用せずに Hbase SCAN API から直接値を読み取るように mapreduce プログラムを作成しました。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
4

1 に答える 1

2

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

于 2015-06-18T08:53:48.027 に答える