为啥从 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