Apache Phoenix Double DataType MapReduceを作成するときの問題 -- java フィールド と hadoop フィールド と hbase フィールド と phoenix フィールド 関連 問題

Apache Phoenix Double Datatype issue when writting MapReduce












0
vote

問題

日本語

apache PhoenixはHBa​​seのテーブルを作成しています。セカンダリインデックス機能とデータ型のような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は、以下のようなBytearrayとしてHBaseで2倍の値を保存しています

<事前> <コード> column=CF1:TOTALAMOUNT, timestamp=1434102384451, value=xC0m@x00x00x00x00x01

Phoenixを使用せずにHBase Scan APIから直接値を読み込むようにMapReduceプログラムを書きました。 PhoenixとMapReduceの両方の出力を参照してください。以下のように0.018310546875としての負の値と負の二重値として戻って、すべての正の二重値が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

英語

I'm using Apache Phoenix to create table in Hbase because it provides secondary index features and also sql like datatypes. I Created a table using phoenix with columns as both Double and Varchar.

CREATE TABLE INVOICE (ROWKEY VARCHAR NOT NULL PRIMARY KEY, CF1.INVOICEID VARCHAR, CF1.TOTALAMOUNT DOUBLE,CF1.STATUS VARCHAR,CF1.CREATEDATE DATE); 

Phoenix is storing Double values in Hbase as ByteArray like below

column=CF1:TOTALAMOUNT, timestamp=1434102384451, value=xC0m@x00x00x00x00x01 

i wrote mapreduce program to read the values directly from Hbase SCAN api without using Phoenix, it's working fine for Varchar values but other datatypes which are stored as Byte array are returning different value. Refer both Phoenix and mapreduce output. All positive double values returning as negative values and negative double values as 0.018310546875 like below

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 
</div
           

回答リスト

1
 
vote

Phoenixは、その異なる変換方式を使用してデータ型をHBaseに格納します。 Phoenixを使用してデータを取得すると、同じ変換方式を使用してデータをデコードして表示します。したがって、MRコードから直接HBaseを接続しようとする代わりに、Phoenix Mapを使用して統合を減らします。

参照: 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 / org / apache / phoenix / schema / pdatatype.java#pdatatype.basecodec.encoddouble%28ダブル%2cbyte []%2cint%29

 

Phoenix uses its different conversion scheme to store datatypes into HBase. When you fetch the data using Phoenix, it decode the data using same conversion scheme and show it to you. So, instead of trying to connect directly HBase from MR code, use Phoenix Map Reduce integration.

Refer: https://phoenix.apache.org/phoenix_mr.html

However, if you still want to directly connect to HBase, you have to use same encoders and decoders which are used by Phoenix.

Refer this class "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

</div
 
 

関連する質問

1  Elixir Flowはローカルマシンで動作しますが、データを処理して投げることはできません。[warn] ** "genstage.streamer"の未定義のhandle_infoがAWS Fargateで  ( Elixir flow works in local machine but does not process data and throw warn ) 
私はAWS S3バケットファイルからデータを処理/ストリーミングし、AWS RDS DBに書き込むためにElixir Flow(Lib)を使用しようとしています。 私は私のローカルマシンでこれをうまく実行することができましたが、私がAWS ECS / FARG...

2  どうしたの?また ! Elixir関数の終わりに行う?  ( What does the or at the end of an elixir function do ) 
! または ? は、Elixir関数の終わりに何を意味しますか?これは言語に特別なもの、または特定のパッケージのためのものですか? <事前> <コード> ExAws.S3.list_buckets() |> ExAws.request!() ...

4  Kerberized Apache PhoenixのNode.jsとNPM JDBCパッケージの問題  ( Node js and npm jdbc package issue with kerberized apache phoenix ) 
NodeJSとNPM JDBCパッケージを使用してHortonWorksでKerberized Apache Phoenixに接続しています.ONODEJSおよびJDBCパッケージを使用して非Kerberized Phoenixに接続できますが、Kerber...

0  Kerberized Apache PhoenixとのNode.jsとNPM Phoenix-Clientパッケージ接続  ( Node js and npm phoenix client package connectivity with kerberized apache phoen ) 
Node.js [ node.jsとnpm jdbcパッケージのkerberized apache phoenix の問題、たくさんの課題に直面しているので、他の解決策を探しています。私の場合、NPM Phoenix-Clientパッケージは良い選択肢のよう...

0  PhonixテーブルをSparkで読むことができません  ( Cant read phonix table with spark ) 
Spark 2.2.3でフェニックステーブルを読みようとしています だから私はbuild.sbt:にこの依存関係を追加しました <事前> <コード> export class TestClass{ constructor(){ con...

-1  HBaseでApache PhoenixをAmbari 1.7にインストールする方法は?  ( How to install apache phoenix to ambari 1 7 with hbase ) 
私はHadoopに新しい。 PhoenixをHBaseでインストールしたいが、UbuntuでAmbari 1.7を使用してHadoopクラスタをインストールしました。私はそうするためにチュートリアルを見つけることができません。 ...

4  Spark 1.3.1 ClassNotFoundExceptionに関するApache Phoenix(4.3.1と4.4.0-HBase-0.98)  ( Apache phoenix 4 3 1 and 4 4 0 hbase 0 98 on spark 1 3 1 classnotfoundexceptio ) 
火花を介してPhoenixに接続しようとしています.JDBCドライバを介して接続を開くときは、次の例外が発生し続けます(下記の簡潔さ、フルスタックトレース): <事前> <コード> Caused by: java.lang.ClassNotFoundExcep...

3  フェニックス;ケースでビューを作成する方法  ( Phoenix how to create a view with case ) 
Apache Phoenixのテーブル上のビューを作成し、ビュー内のベーステーブル列の1つの値を追加/変更しようとしています。 これのようなもの: <事前> <コード> CREATE VIEW mobile_product_metrics (new_col ...

0  Apache Phoenixに列が存在するかどうかを確認する方法  ( How to check if a column exists in apache phoenix ) 
Javaを使用してApache Phoenixのテーブルに列がすでに存在する場合はどうすればわかりますか? ...

1  Apache Phoenix Limit Offset Error  ( Apache phoenix limit offset error ) 
エラーが何を意味するのかを知る必要があり、それをデバッグする方法。 これが私がしたことです。 Query1: <事前> <コード> SELECT * FROM us_population ORDER BY population DESC; 結果1: <事...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有