从BigDecimal转换为DECIMAL时,为什么impala-jdbc会引发异常?

时间:2019-05-31 08:03:11

标签: jdbc cloudera impala apache-kudu

我正在使用impala-jdbc 2.6.4.1005写入Kudu表。

当将一个大小为7896163500的BigDecimal插入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 :(得分:0)

这是预期的事件。

在Impala中,默认情况下-如果您将诸如7896163500之类的值指定为DECIMAL列,则Impala会检查该列是否具有足够的精度来表示该整数类型的最大值,否则将引发错误。

此处7896163500是BIGINT,BIGINT的最大存储量为8字节。由于我们这里有2个小数位数,因此您会看到以下错误,

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

因此,对于DEDECIM列,请使用(cast(7896163500 as BIGINT)之类的表达式作为DECIMAL(12,2)),以插入详细信息。希望这会有所帮助!

有关更多信息:https://www.cloudera.com/documentation/enterprise/5-6-x/topics/impala_decimal.html