gpt4 book ai didi

python - Cassandra 小数精度问题

转载 作者:搜寻专家 更新时间:2023-10-30 20:22:43 28 4
gpt4 key购买 nike

我一直在 Cassandra 中将一些货币存储为十进制类型,我发现它们的输出并不像输入的那样精确。这通常没问题,但有时我需要精度(2 位小数)。我试图将精确语法添加到我的所有代码(创建表、选择、插入),但所有代码都因语法错误而失败。我觉得在数据库调用上进行舍入比在 Pandas DataFrame 中进行舍入更有效,所以我想看看是否有人有解决方案。我正在尝试 cqlsh 和 Python 中的语法。

cqlsh 5.0.1 | Cassandra 3.11.2 | CQL 规范 3.4.4 |原生协议(protocol) v4

尝试在表格列上这样做:

CREATE TABLE IF NOT EXISTS myTable (
myid text,
price decimal(14,2),
PRIMARY KEY(id)
);

cassandra.protocol.SyntaxException: <Error from server: code=2000 [Syntax error in CQL query] message="line XXXXX no viable alternative at input '(' (... [decimal](...):>

我看到一条评论说 Cassandra 不允许精确定义表,很好,继续。

尝试在 SELECT 上执行:

SELECT myid, cast(price as Decimal(14,2)) FROM myTable;

Syntax Exception: mismatched input '(' expecting ')' (...myid, cast(price as Decimal[(]...)

我将跳过插入,因为错误是多余的,而且 DataFrame 中的值在输入时具有正确的精度。表格存储和选择是它变得不稳定的地方。

SELECT 失败,因为无法将 Decimal 转换为 Decimal: http://cassandra.apache.org/doc/latest/cql/functions.html

如果我不能在表语义中指定精度,我不能将它存储为十进制并以适当的精度转换它,我想我被迫:

  • 存储在 double 中并在选择时强制转换,或者
  • 返回后以编程方式舍入我的 DataFrame?

编辑:

为了完整起见,这是一个可行的解决方案,但我更喜欢最有效的解决方案,我认为它会在数据获取级别四舍五入。任何 CQL 中都没有精度修饰符,价格列使用小数类型。解决方案改编自 ( Decimal class rounding in Pandas ),因为 df.round() 不适用于 Python Decimal。

<set pandas row factory>
df = dbConnection.execute('SELECT myid, price FROM myTable')._current_rows
df[['price']] = df[['price']].applymap(lambda x: x.quantize(decimal.Decimal('.01')))

最佳答案

与 SQL 数据库相比,CQL 不允许自定义小数精度等,因此您只需要使用 decimal。您在 cqlsh 中收到的数据由 cqlsh 本身格式化 - 在默认配置中,它只是在 Python 的 实例上调用 str十进制 类型(参见 the code )。如果小数分隔符设置为不同于 . 的值,或者设置了千位分隔符,它可能会调用另一个格式化程序。

但我建议不要依赖cqlsh实现,直接使用驱动程序,并根据需要格式化接收到的decimal值。

关于python - Cassandra 小数精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58002030/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com