为什么impalajdbc在从bigdecimal转换到decimal时抛出异常?

t9aqgxwy  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(544)

我正在使用impalajdbc2.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'

但是,我插入的值也适合十进制(12,2)。我不明白为什么我从司机那里得到这个错误。
如果我将列定义为decimal(30,2),它将正常工作。
此外,如果我尝试手动进行强制转换,我会得到预期的结果:

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

bqf10yzr1#

这是一个预期的事件。
在 Impala ,默认情况下- 如果指定值(如7896163500)进入 十进制的 列,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))  对于 十进制的 列中插入详细信息。希望这有帮助!
更多信息: https://www.cloudera.com/documentation/enterprise/5-6-x/topics/impala_decimal.html

相关问题