1

我正在使用 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
4

1 回答 1

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'

因此,请使用类似于 DECIMAL 列的表达式,就像(cast(7896163500 as BIGINT)DECIMAL(12,2)) 已经完成插入详细信息一样。希望这可以帮助!

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

于 2019-05-31T15:00:23.667 回答