2013-03-07 4 views
2

Я провел целый день, пытаясь вставить данные в простую базу данных cassandra для хранения имени пользователя, пароля, электронной почты и телефона. Все проведенные мной исследования не позволяют мне вернуться к http://hector-client.github.com/hector/build/html/content/getting_started.html#update. Я следовал примеры к письму, но когда я пытаюсь выполнить свой код:Как сохранить новую строку клиента в Кассандре с помощью Гектора?

 ConfigurableConsistencyLevel ccl = new ConfigurableConsistencyLevel(); 
    Map<String, HConsistencyLevel> clm = new HashMap<String, HConsistencyLevel>(); 

    clm.put("customers", HConsistencyLevel.ONE); 
    ccl.setReadCfConsistencyLevels(clm); 
    ccl.setWriteCfConsistencyLevels(clm); 
    Cluster cluster = HFactory.getOrCreateCluster("test-cluster", "localhost:9160");  

    Keyspace ksp = HFactory.createKeyspace("qualebs", cluster); 
    ksp.setConsistencyLevelPolicy(ccl); 

    ColumnFamilyTemplate<String, String> template = new ThriftColumnFamilyTemplate<String, String>(ksp, "customers", StringSerializer.get(), StringSerializer.get()); 

    ColumnFamilyUpdater<String, String> updater = template.createUpdater("KeyIsUsername"); 
    updater.setString("name", "the name"); 
    updater.setString("email", "[email protected]"); 
    template.update(updater); 

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

Caused by: InvalidRequestException(why:Not enough bytes to read value of component 0) 
at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20833) 
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) 
at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:964) 
at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:950) 
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246) 
at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243) 
at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:104) 
at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258) 
... 57 more 

мне нужна помощь с пониманием причин для этой ошибки.

Моя схема, которую я создал из cqlsh терминала выглядит

CREATE TABLE customers(username text PRIMARY KEY, name text, email text); 
+0

Какую версию Кассандры вы используете? Похоже, что ваш тип ключа или столбца - это CompositeType, но ваш бережливый код использует UTF8Type. Выполняли ли вы какие-либо другие изменения схемы? В какой версии CQL вы создали таблицу? – Richard

+0

сэр спасибо вам большое за внимание. Я использую версию cassandra 1.2.2, и я использовал CQL VERSION 3.0, который включен в tar. Я не изменил таблицу. как указать эти ключи compositeType и utfType при выполнении обновления от Hector – qualebs

+0

Это не должно быть CompositeType с этим определением. Использование составного первичного ключа сделает ключ CompositeType и может вызвать эту проблему - см. Http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/Inserting-via-thrift-interface-to-column -семейством-сотворены с-Компаунд-Key-через-cql3-td7585194.html. Вы можете попробовать создать семейство столбцов через cassandra-cli, если вы не собираетесь использовать CQL для его запроса. – Richard

ответ

1

Другим вариантом может быть, чтобы попытаться playOrm, который делает правильные преобразования для вас и создает КФ для вас, как хорошо, так что вам не нужно беспокоиться о создании его неправильно;). Просто вариант.

Получить структуру через PlayOrm домашнюю страницу или через GitHub