【问题标题】: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

【问题讨论】:

    标签: jdbc cloudera impala apache-kudu


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 2013-02-11
      • 2021-04-28
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多