Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 卡桑德拉十进制精度问题_Python_Database_Cassandra_Decimal_Cql - Fatal编程技术网

Python 卡桑德拉十进制精度问题

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

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

cqlsh 5.0.1 | Cassandra 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](...):>
我将跳过插入,因为错误是多余的,而且数据帧中的值在输入时具有正确的精度。桌子的存储和选择是它变得不可靠的地方

选择失败,因为无法将十进制转换为十进制:

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

  • 以双精度存储并在选择时强制转换,或
  • 在返回数据帧后以编程方式对其进行取整
编辑:

为了完整性,这是一个有效的解决方案,尽管我更喜欢最有效的解决方案,我认为应该在数据获取级别进行舍入。任何CQL中都没有精度修饰符,价格列使用十进制类型。解决方案改编自(),因为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')))

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')))