Почему impala-jdbc генерирует исключение при приведении из BigDecimal к DECIMAL? - PullRequest
1 голос
/ 31 мая 2019

Я пишу в таблицу Kudu, используя impala-jdbc 2.6.4.1005.

Я получил эту ошибку при вставке BigDecimal со значением 7896163500 в DECIMAL (20,2).

[Cloudera][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:AnalysisException: Possible loss of precision for target table 'ST.RFQ_SPOT'.
Expression '7896163500' (type: BIGINT) would need to be cast to DECIMAL(20,2) for column 'req_amount'

Тем не менее, значение, которое я вставляю, поместится и в DECIMAL (12,2). Я не могу понять, почему я получаю эту ошибку от водителя.

Если я определю столбец как DECIMAL (30,2), он будет работать правильно.

Кроме того, если я попытаюсь вручную выполнить приведение, я получу ожидаемый результат:

select cast (cast(7896163500 as BIGINT) as DECIMAL(12,2))
1   7896163500.00

1 Ответ

0 голосов
/ 31 мая 2019

Это ожидаемое событие.

В Impala по умолчанию - если вы указываете значение, например 7896163500, для перехода в столбец DECIMAL, Impala проверяет, имеет ли столбец достаточную точность для представления наибольшего значения этого целочисленного типа, и выдает ошибку, если нет.

Здесь 7896163500 - это BIGINT, а максимальный объем памяти BIGINT составляет 8 байт. Поскольку у нас здесь есть две дробные цифры, вы видите ошибку ниже,

Expression '7896163500' (type: BIGINT) would need to be cast to DECIMAL(20,2) for column 'req_amount'

Поэтому используйте выражение типа (cast(7896163500 as BIGINT) как DECIMAL(12,2)) для столбцов DECIMAL, как вы уже сделали для вставки деталей. Надеюсь, это поможет!

Подробнее: https://www.cloudera.com/documentation/enterprise/5-6-x/topics/impala_decimal.html

...