为什么Amazon Redshift会截断此JSON浮点数据的精度?

时间:2016-05-05 22:58:36

标签: json amazon-redshift

我发现Amazon Redshift将浮点数的精度截断到非常低的精度(6位)。有没有办法解决这个问题?

示例:

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)

似乎浮动应该具有更高的精度,而不是更少!!!

感谢您的任何见解。

1 个答案:

答案 0 :(得分:0)

问题不在于Redshift本身的FLOAT精度,而在于解析的JSON数的精度。如果我们查询JSON而不进行任何转换......

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

...导致此VARCHAR值:

"1.23457e+08"

因此,任何后续的FLOAT转换只能用于此已经不准确的值。

解决方法是将JSON中的数字存储为字符串...

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

如果需要更高的精度,可以使用转换为DECIMAL数据类型...

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

或者你也可以实现一个User-Defined Function,你可以用更高的精度自己进行JSON解析。