2014-10-31 2 views
5

Я пытаюсь запустить драйвер узла cassandra и вставил проблему при вставке записи, похоже, что драйвер cassandra не может вставлять значения float.ResponseError: Ожидаемый 4 или 0 байт int

Problem: When passing int value for insertion in db, api gives following error: 
    Debug: hapi, internal, implementation, error 
     ResponseError: Expected 4 or 0 byte int (8) 
     at FrameReader.readError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/readers.js:291:13) 
     at Parser.parseError (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:185:45) 
     at Parser.parseBody (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:167:19) 
     at Parser._transform (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/cassandraTest/node_modules/cassandra-driver/lib/streams.js:101:10) 
     at Parser.Transform._read (_stream_transform.js:179:10) 
     at Parser.Transform._write (_stream_transform.js:167:12) 
     at doWrite (_stream_writable.js:225:10) 
     at writeOrBuffer (_stream_writable.js:215:5) 
     at Parser.Writable.write (_stream_writable.js:182:11) 
     at write (_stream_readable.js:601:24) 

Я пытаюсь выполнить следующий запрос из кода:

INSERT INTO ragchews.user 
(uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city) 
VALUES 
('uid_1',{'iid1'},'jid_1','pass_1',25, 10, {'NEX1231'}, {'MUSIC'}, 21.321, 43.235, 'delhi'); 

параметра, переданного execute() является

var params = [uid, iid, jid, jpass, rateCount, numOfratedUser, hndl, interest, locx, locy, city]; 

где

var locx = 32.09; 
var locy = 54.90; 

и призывают выполнить ло OKS, как:

var addUserQuery = 'INSERT INTO ragchews.user (uid ,iid ,jid ,jpass ,rateCount ,numOfratedUser ,hndl ,interests ,locX ,locY ,city) VALUES (?,?,?,?,?,?,?,?,?,?,?);'; 
var addUser = function(user, cb){ 
    console.log(user); 
    client.execute(addUserQuery, user, function(err, result){ 
     if(err){ 
      throw err; 
     } 
     cb(result); 
    }); 
}; 

CREATE TABLE ragchews.user( 
    uid varchar,  
    iid set<varchar>, 
    jid varchar,  
    jpass varchar, 
    rateCount int, 
    numOfratedUser int, 
    hndl set<varchar>, 
    interests set<varchar>, 
    locX float, 
    locY float, 
    city varchar, 
    favorite map<varchar, varchar>, 
    PRIMARY KEY(uid) 
); 

PS Некоторые наблюдения, пытаясь понять проблему:

  1. Так как кажется, проблема с плавающей точкой, так что я изменил тип с плавающей точкой (из Locx, LocY) в целое и повторите запуск кода. Такая же ошибка сохраняется. Следовательно, это не проблема, связанная специально с float CQL-типом.
  2. Далее я попытался удалить все int из запроса INSERT и попытался вставить только нечисловые значения. Эта попытка успешно ввела значение в db. Следовательно, теперь похоже, что this problem may be associated with numeric types.

ответ

17

Эти слова, как это собирается из cassandra node driver data type documentation

При кодировании данных, на нормальное выполнение с параметрами, драйвер пытается угадать тип цели в зависимости от типа ввода. Значения типа Number будут закодированы как двойные (в качестве значения Number double/IEEE 754).

Рассмотрим следующий пример:

var key = 1000; 
client.execute('SELECT * FROM table1 where key = ?', [key], callback); 

Если ключевой столбец имеет тип INT, выполнение терпит неудачу. Есть два возможных пути, чтобы избежать такого рода проблемы:

  1. Приготовьте данные (рекомендуется) - подготовить запрос перед выполнением

    client.execute('SELECT * FROM table1 where key = ?', [key], { prepare : true }, callback);

  2. Намекая целевых типов - Подсказка: первый параметр представляет собой целое число

    client.execute('SELECT * FROM table1 where key = ?', [key], { hints : ['int'] }, callback);

Если вы имеете дело с пакетным обновлением, то this issue может вас заинтересовать.

+1

Отличная деталь в ответе, хорошо, что вы указали на пакетную проблему. – jorgebg

+2

Первый подход работает для меня, спасибо –

Смежные вопросы