Python 卡桑德拉十进制精度问题
我在Cassandra中存储了一些十进制类型的货币,我发现它们并不像输入的那样精确。这通常是可以的,但是有时我需要精度(小数点后2位)。我尝试向我的所有代码(创建表、选择、插入)添加精确语法,但所有操作都因语法错误而失败。我觉得在数据库调用中进行舍入比在熊猫数据帧中进行舍入更有效,所以我想看看是否有人有解决方案。我正在尝试cqlsh和Python中的语法 cqlsh 5.0.1 | Cassandra 3.11.2 | CQL规范3.4.4 |本机协议v4 尝试在表列上执行此操作:Python 卡桑德拉十进制精度问题,python,database,cassandra,decimal,cql,Python,Database,Cassandra,Decimal,Cql,我在Cassandra中存储了一些十进制类型的货币,我发现它们并不像输入的那样精确。这通常是可以的,但是有时我需要精度(小数点后2位)。我尝试向我的所有代码(创建表、选择、插入)添加精确语法,但所有操作都因语法错误而失败。我觉得在数据库调用中进行舍入比在熊猫数据帧中进行舍入更有效,所以我想看看是否有人有解决方案。我正在尝试cqlsh和Python中的语法 cqlsh 5.0.1 | Cassandra 3.11.2 | CQL规范3.4.4 |本机协议v4 尝试在表列上执行此操作: CREATE
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](...):>
我将跳过插入,因为错误是多余的,而且数据帧中的值在输入时具有正确的精度。桌子的存储和选择是它变得不可靠的地方
选择失败,因为无法将十进制转换为十进制:
如果我不能在表语义中指定精度,也不能将其存储为十进制并以适当的精度强制转换,我想我必须:
- 以双精度存储并在选择时强制转换,或
- 在返回数据帧后以编程方式对其进行取整
<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')))
df=dbConnection.execute('SELECT myid,price FROM myTable')。\u当前\u行
df[['price']]=df['price']].applymap(lambda x:x.quantize(decimal.decimal('.01'))
与SQL数据库相比,CQL不允许自定义十进制精度等,因此您只需要使用十进制
。您在cqlsh
中接收回的数据由cqlsh
本身格式化-在默认配置中,它只在Python的Decimal
类型的实例上调用str
(请参阅)。如果十进制分隔符设置为与
不同的值,或者如果设置了千位分隔符,则它可能会调用另一个格式化程序
但我建议不要依赖于cqlsh
实现,直接使用驱动程序,并根据需要格式化收到的decimal
值。处理问题的一种糟糕方法是先将caste转换为double,然后再转换为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')))