#python #python-3.x #cassandra
#python #python-3.x #cassandra
Вопрос:
Я новичок в Apache Cassandra (с использованием Python 3) и пытаюсь создать таблицу на основе CSV-файла. Вот как файл выглядит следующим образом: https://i.stack.imgur.com/aYRS1.jpg (извините, но у меня недостаточно очков репутации, чтобы опубликовать изображение здесь)
Сначала я создаю таблицу
query1 = "CREATE TABLE IF NOT EXISTS table1(artist text, title text,
length text, sessionId text, itemInSession text, PRIMARY KEY (sessionId, title, artist))"
session.execute(query1)
И затем я пытаюсь прочитать файл и вставить нужные данные в таблицу:
file = 'event_datafile_new.csv'
with open(file, encoding = 'utf8') as f:
csvreader = csv.reader(f)
next(csvreader) # skip header
for line in csvreader:
query = "INSERT INTO table1(artist, title, length, sessionId, itemInSession)"
query = query "VALUES(%s, %s, %s, %s, %s)"
session.execute(query, (line[0], line[9], line[5], line[8], line[3]))
Однако я получаю следующую ошибку:
---> 13 session.execute(query, (line[0], line[9], line[5], line[8], line[3]))
/opt/conda/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so in cassandra.cluster.Session.execute (cassandra/cluster.c:38536)()
/opt/conda/lib/python3.6/site-packages/cassandra/cluster.cpython-36m-x86_64-linux-gnu.so in cassandra.cluster.ResponseFuture.result (cassandra/cluster.c:80834)()
InvalidRequest: Error from server: code=2200 [Invalid query] message="Invalid STRING constant (288.9922) for "length" of type float"
Даже когда я попытался изменить формат «length» на float — и %s на %f в инструкции INSERT — это не сработало. Кто-нибудь знает, в чем может быть проблема? Большое спасибо! 🙂
Комментарии:
1. Черт возьми, имеет смысл изменить тип данных length на float . И вот в этой строке вашей программы
query = query "VALUES(%s, %s, %s, %s, %s)"
вы можете захотеть подставить значения, а затем вызватьsession.execute
. Это может помочь распечатать, какие значения принимаются перед выполнениемsession.execute
(в случае, если некоторые строки не анализируются должным образом).2. можете ли вы выполнить в
cqlsh
следующих командах:use put_your_keyspace_here;
иdescribe table1;
?3. Кроме того, я не уверен в преобразовании данных в модуле python CSV — по умолчанию это string, но может быть преобразован в float, если указаны некоторые параметры. можете ли вы распечатать
type(line[5])
перед выполнением insert?4. Вы пробовали ставить одиночные «галочки» вокруг «% s»? Не разбираюсь в Python, но поскольку это текстовые элементы, тексту нужны одиночные тики. Например: ЗНАЧЕНИЯ (‘%s’, ‘%s’, ‘%s’, ‘%s’, ‘%s’)
5. Этот вопрос является заданием в программе Udacity Data engineering.
Ответ №1:
Всякий раз, когда вы читаете из файла с помощью csvreader: «Каждая строка, прочитанная из файла csv, возвращается в виде списка строк, автоматическое преобразование типа данных не выполняется, если не указан параметр QUOTE_NONNUMERIC format» от:https://docs.python.org/3/library/csv.html
с таблицей, определенной с такими типами, как:
"CREATE TABLE IF NOT EXISTS table1(artist text, title text,
length double, sessionId int, itemInSession int, PRIMARY KEY (sessionId, title, artist))"
Если вы приведете свои значения к правильному типу, это должно сработать. Я попробовал это, и это сработало.
session.execute(query, (line[0], line[9], float(line[5]), int(line[8]), int(line[3])))