2016-05-05 1 views
0

Amazon Redshiftが浮動小数点数の精度を非常に低い精度(6か所)で切り捨てていることがわかりました。これを回避する方法はありますか?Amazon RedshiftがこのJSON浮動小数点データの精度を切り捨てるのはなぜですか?

例:

SELECT 
JSON_EXTRACT_PATH_TEXT('{"a":123456789.5555555, "b":123456789.0}', 'a')::float, 
JSON_EXTRACT_PATH_TEXT('{"a":123456789.5555555, "b":123456789.0}', 'b')::float; 

は与える:

json_extract_path_text | json_extract_path_text 
------------------------+------------------------ 
       123457000 |    123457000 
(1 row) 

は整数にすることを比較:

になり
SELECT 
JSON_EXTRACT_PATH_TEXT('{"a":123456789, "b":123456789}', 'a')::float, 
JSON_EXTRACT_PATH_TEXT('{"a":123456789, "b":123456789}', 'b')::float; 

json_extract_path_text | json_extract_path_text 
------------------------+------------------------ 
       123456789 |    123456789 
(1 row) 

フロートの精度はそれほど高くないはずです!

ありがとうございました。

+0

分析データベースでこのような精度が必要なのはなぜですか?とにかく、このような高精度を必要としないAVGやその他の統計関数を実行しようとしています。 – Guy

答えて

0

問題は、Redshift自体のFLOAT精度ではなく、解析されたJSON数の精度です。私たちは...任意の変換を行わず、このVARCHAR値になり

SELECT JSON_EXTRACT_PATH_TEXT('{"a":123456789.5555555}', 'a'); 

を... JSONを照会した場合:

"1.23457e+08" 

したがってFLOATへの後続の変換にのみ、このすでに不正確な値で動作することができます。

さらに高い精度が必要な場合に回避策は

SELECT JSON_EXTRACT_PATH_TEXT('{"a":"123456789.5555555"}', 'a')::float; 
↓ 
123456789.55555549 

...文字列としてJSON内の数値を格納することで、DECIMALデータ型への変換が

SELECT JSON_EXTRACT_PATH_TEXT('{"a":"123456789.5555555", "b":123456789.0}', 'a')::decimal(20, 10) 
↓ 
123456789.5555555000 

...使用することができます

User-Defined Functionを実装して、より正確にJSON解析を行うこともできます。

関連する問題