【问题标题】:AWS - Redshift Decimal issueAWS - Redshift 十进制问题
【发布时间】:2021-01-22 19:54:36
【问题描述】:

我正在通过 S3 存储桶将数据从 Amazon EventBridge 发送到 Redshift。

我对发送的十进制值有疑问。

这是我存储在 s3 上的 jsonpath 文件的示例。

{
    "jsonpaths": [
        "$.id",
        "$detail.TotalPaid"
   ] 
}

redshift 上的列类型是 Decimal(12,2)

如果我运行 SQL 插入,数据会正确保存 -

insert into payments values(1, 10.15);

但是,如果从 EventBus 传递相同的信息,则 TotalPaid 列将保存为 10.14。

上述问题似乎只在发送带 2 个小数位的值时出现。例如,如果发送 10.1,则该列中的数据将正确保存为 10.10

我之前曾尝试将列设置为 VARCHAR 类型,但在数据库中保存了不正确的值。我打算尝试使用 Float 类型,但查看 AWS 文档,它确实说使用 DECIMAL 表示货币金额而不是浮点类型。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: amazon-s3 amazon-redshift


    【解决方案1】:

    问题已解决。我必须在 AWS 传输流上的复制命令中添加 roundec 转换参数 - https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html#copy-roundec

    【讨论】:

    • 我也遇到过同样的问题,我只是想补充一点,即使 Roundec 选项解决了这个问题,我仍然不完全满意,因为输入数据仍然非常适合目标字段。所以我在 AWS 支持下提出了它,它显然是 Json 解析库的限制
    【解决方案2】:

    您的 INSERT 语句看起来不对劲。您是否尝试将值 1 和 10.15 插入到付款表的 2 列中?

    如果是这样,您需要将其格式化为 - INSERT INTO Payments VALUES(1, 10.15)。

    如果不能,您能否准确解释您要做什么以及表的 DDL。

    【讨论】:

    • 对不起,我最初问题中的 sql 插入不正确。我正在运行 INSERT INTO payment VALUES(1, 10.15);按预期工作。问题是当数据从 AWS 事件总线发送到 Redshift 时,由于某种原因,10.15 的值在数据库中被保存为 10.14。
    • 您确定发送的值不是 10.145 吗?该值将在转换为十进制时四舍五入
    • 我想要做的是将事件从微服务发送到 AWS 事件总线,然后将事件保存在 redshift 中。我检查了日志,发送到事件总线的 TotalPaid 的值是 10.15,正如预期的那样。但是,将该数据从事件总线发送到 redshift 会将值保存为 10.14 在 redshift 表中。
    • 这可能是问题比尔,我明天回来工作时会仔细检查。
    • 舍入与截断是一个常见问题。顺便说一句,将财务数据存储为 DECIMAL(19,4) 以保持四舍五入远低于便士水平并符合 GAAP 是一种常见做法。然后在报告时将结果转换为 2 位有效数字。
    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多