2013-05-02 2 views
2

Im в настоящее время работает с Apache Cassandra (версия Cassandra: 1.2.3, версия Thrift API: 19.35.0, поддерживаемые CQL версии: 2.0.0.3.0.1 (по умолчанию: 3.0.1)) и Hector 1.0.5.Cassandra: Hector, serializationException недопустимый заголовок строчки

Im, используя следующий код для вставки и извлечения объекта.

String cf="User"; 
key="myKey"; 
String colName="colName"; 
String colValue="colvalue"; 

Mutator<String> mutator = HFactory.createMutator(keyspace, StringSerializer.get()); 
mutator.insert(key, cf, HFactory.createStringColumn(colName, colValue)); 



ColumnQuery<String, String, Object> columnQuery = HFactory.createColumnQuery(
    keyspace, 
    StringSerializer.get(), 
    StringSerializer.get(), 
    ObjectSerializer.get()); 

    columnQuery.setColumnFamily(cf).setKey(key).setName(colName); 
    QueryResult<HColumn<String, Object>> r = columnQuery.execute(); 

    System.out.println("Read HColumn from cassandra: " + r.get()); 

Но я получаю следующее исключение:

Exception in thread "main" me.prettyprint.hector.api.exceptions.HectorSerializationException: java.io.StreamCorruptedException: invalid stream header: 636F6C76 
    at me.prettyprint.cassandra.serializers.ObjectSerializer.fromByteBuffer(ObjectSerializer.java:79) 
    at me.prettyprint.cassandra.model.HColumnImpl.getValue(HColumnImpl.java:124) 
    at me.prettyprint.cassandra.model.HColumnImpl.toString(HColumnImpl.java:202) 
    at java.lang.String.valueOf(String.java:2854) 
    at java.lang.StringBuilder.append(StringBuilder.java:128) 
    at org.dargamenteria.tfg.texu.logic.UserDAOImpl.create(UserDAOImpl.java:111) 

Но следующий код работает, только что изменил ObjectSerializer к StringSerializer:

Mutator<String> mutator = HFactory.createMutator(keyspace, StringSerializer.get()); 
mutator.insert(key, cf, HFactory.createStringColumn(colName, colValue)); 

ColumnQuery<String, String, String> columnQuery = HFactory.createColumnQuery(
    keyspace, 
    StringSerializer.get(), 
    StringSerializer.get(), 
    StringSerializer.get()); 

    columnQuery.setColumnFamily(cf).setKey(key).setName(colName); 
    QueryResult<HColumn<String, String>> r = columnQuery.execute(); 

    System.out.println("Read HColumn from cassandra: " + r.get()); 

ответ

1

Если посмотреть в иерархии Hector Serializer, вы найдет, что ObjectSerializer & StringSerializer являются одновременно братьями и сестрами, реализуя интерфейс Serializer и расширяя класс AbstractSerializer.

fromByteBuffer метод в StringSerializer ожидает строку, тогда как в ObjectSerializer ожидает объект. И в вашем коде вы определили значение столбца как тип строки, поэтому вам нужно использовать StringSerializer, поскольку ваш набор кода ожидает тип String.

+0

Спасибо за ваш ответ Abhi. В первом случае я определяю значение столбца как объекта, а сериализатор - ObjectSerializer, и когда я пытаюсь получить значение, я получил это исключение: «Исключение в потоке» main «me.prettyprint.hector.api.exceptions .HectorSerializationException: java.io.StreamCorruptedException: недопустимый заголовок потока: 636F6C76 « Но во втором столбце значения String и StringSerializer все работает правильно. И это то, что делает меня орехами. – Dani

+0

hmmm .... во время создания семейства столбцов, я думаю, вы могли бы упомянуть валидатор значений столбца по умолчанию как UTF8Type. Можете ли вы поделиться выводами ** описать CF_NAME ** из cassandra-cli – abhi

0

Прежде всего, что благодаря Абхи за его ответ :) вы дали несколько важных подсказок.

Что я сделал, так это вставка ByteBuffers с помощью соответствующих сериализаторов. Например

mutator.addInsertion(key, columnFamilyName, 
HFactory.createColumn("name",     
    ByteBufferSerializer.get().fromByteBuffer(StringSerializer.get().toByteBuffer(uh.getName())), 
    StringSerializer.get(), 
    ByteBufferSerializer.get())). 

addInsertion(key, columnFamilyName, 
HFactory.createColumn("email",     
    ByteBufferSerializer.get().fromByteBuffer(ObjectSerializer.get().toByteBuffer(uh.getEmail())), 
    StringSerializer.get(), 
    ByteBufferSerializer.get())). 

и извлечения их, например

StringSerializer.get().fromByteBuffer(
       r.get().getColumnByName("name").getValue()) 

Спасибо вам всем!

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