卡桑德拉十进制精度问题

2024-04-28 17:59:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

cqlsh 5.0.1 |卡桑德拉3.11.2 | CQL规范3.4.4 |本机协议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不允许表定义的精确性,所以很好,继续。在

尝试在选择时执行此操作:

^{pr2}$

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

选择失败,因为无法将十进制转换为十进制: http://cassandra.apache.org/doc/latest/cql/functions.html

如果我不能在表语义中指定精度,也不能将其存储为decimal并以适当的精度进行转换,我想我必须:

  • 储存在双倍和铸造选择,或
  • 在返回数据帧后以编程方式取整它?在

编辑:

为了完整起见,这是一个有效的解决方案,尽管我更喜欢最有效的解决方案,我认为这应该是在数据获取级别舍入。任何CQL中都没有精度修饰符,对price列使用decimal类型。解决方案改编自(Decimal class rounding in Pandas)自东风轮()在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')))

Tags: 数据类型pandasdfmytable语法精度解决方案
1条回答
网友
1楼 · 发布于 2024-04-28 17:59:43

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

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

相关问题 更多 >