为啥从 BigDecimal 转换为 DECIMAL 时 impala-jdbc 会抛出异常?

Posted

技术标签:

【中文标题】为啥从 BigDecimal 转换为 DECIMAL 时 impala-jdbc 会抛出异常?【英文标题】:Why impala-jdbc throws exception when casting from BigDecimal to DECIMAL?为什么从 BigDecimal 转换为 DECIMAL 时 impala-jdbc 会抛出异常? 【发布时间】:2019-05-31 08:03:10 【问题描述】:

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

这是一个预期的事件。

在 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

【讨论】:

以上是关于为啥从 BigDecimal 转换为 DECIMAL 时 impala-jdbc 会抛出异常?的主要内容,如果未能解决你的问题,请参考以下文章

java.math.BigInteger 不能转换为 java.math.BigDecimal

将 double 转换为 BigDecimal 并设置 BigDecimal 精度

row.getList java.lang.ClassCastException:java.math.BigDecimal 不能转换为 scala.collection.Seq

[类型转换] Object 转换为 BigDecimal

将值从 JsonObject 转换为 BigDecimal

如何将 BigDecimal 转换为指数形式?