Python Cassandra Driver: проблема с кодировкой при вставке

Я разрабатываю простой модуль python, который считывает данные из файла tsv и загружает их в таблицу пространств ключей Cassandra.

Я начал с просмотра примеров, представленных Datastax, и все было в порядке, поэтому я начал кодировать.

Программа правильно читает данные из tsv-файла, переводит их в список строк, и я проверил, что каждый элемент каждой строки имеет правильный тип для столбца назначения. Но когда я пытаюсь вставить raw в таблицу, терминал говорит:

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'. Я также прочитал другие вопросы здесь и попытался использовать str(row) и repr(row) в prepare.bind(), но у меня появились другие ошибки.

Я новичок в 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

)

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)
Другие вопросы по тегам