【问题标题】:Python Cassandra Driver: encoding issue during insertionPython Cassandra 驱动程序:插入期间的编码问题
【发布时间】:2018-08-03 15:06:26
【问题描述】:

我正在开发一个简单的 python 模块,它从 tsv 文件中读取数据并将它们加载到 Cassandra 键空间表中。

我从查看 Datastax 给出的示例开始,一切似乎都很好,所以我开始编写代码。

程序正确地从 tsv 文件中读取数据,并将它们转换为行列表,并且我验证了每一行的每个元素都具有目标列的正确类型。但是当我尝试将原始数据插入表格时,终端会说:

AttributeError: 'float' 对象没有属性 'encode'

这是代码:

#Upload data to Cassandra DB (cassandra_df is a Pandas dataframe)
session.set_keyspace(data_ks)
cassandra_df_list = cassandra_df.values.tolist()

query = "INSERT INTO table_str (rowid,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,ba,bb,bc,bd) VALUES (uuid(),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
prepared = session.prepare(query)

for row in cassandra_df_list:

    prepared.bind(row)
    session.execute(prepared)

cluster.shutdown()

为了解决问题,我进行了很多更改,但我遇到了新问题或使用 'int' 而不是 'float' 的问题。我还在这里阅读了其他问题并尝试在prepared.bind()中使用str(row)和repr(row),但我遇到了其他错误。

我是 Python 新手,找不到其他解决方案,你会怎么做?

提前致谢!

编辑 抱歉,我忘了提供有关数据库表的详细信息。这是创建语句:

CREATE TABLE prova.table_str (
rowid uuid PRIMARY KEY,
a text,
aa text,
ab text,
ac text,
ad text,
ae text,
af text,
ag text,
ah text,
ai text,
aj double,
ak double,
al double,
am text,
an double,
ao double,
ap double,
aq double,
ar double,
as double,
at double,
au double,
av double,
aw double,
ax double,
ay double,
az double,
b text,
ba double,
bb text,
bc text,
bd text,
c text,
d text,
e int,
f text,
g text,
h text,
i text,
j text,
k double,
l int,
m text,
n double,
o int,
p int,
q text,
r text,
s text,
t text,
u text,
v int,
w text,
x text,
y text,
z text

)

【问题讨论】:

    标签: python cassandra datastax datastax-python-driver


    【解决方案1】:

    您没有共享您的架构或堆栈跟踪,但我猜数据框具有数字类型,并且您的 Cassandra 表有一堆字符串列。我将概述三种可能的解决方案:

    1.) 使表类型与您的数据匹配,以便绑定编码起作用。

    2.) 将参数转换为与架构相同的类型。例如,如果它们都是字符串:

    prepared.bind(str(c) for c in row)
    

    3.) 使用简单的语句而不是准备语句。在这种情况下,您可以将 ? 绑定标记替换为 %s,并让驱动程序使用参数的字符串插值。

    query = "INSERT INTO table_str (rowid,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,ba,bb,bc,bd) VALUES (uuid(),%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
    for row in cassandra_df_list:
        session.execute(query, row)
    

    【讨论】:

    • 非常感谢亚当。我忘了说有 TEXT、DOUBLE 和 INT 值,但无论如何我理解了这个概念。此外,我会尝试更换 ? %s,我会告诉你的。再次感谢!
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2015-05-18
    • 2016-10-06
    • 2017-11-05
    • 2016-06-28
    • 2019-08-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多