Ошибка недопустимой строковой константы в Apache Cassandra (с использованием Python)

#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])))