Получить строку по ключу Кассандры, используя Гектор - PullRequest
3 голосов
/ 13 сентября 2011

Я вставляю в CF и все идет хорошо, я также могу прочитать полный ряд из cassandra-cli с помощью простого

get columnFamily[lexicaluuid(de80a290-dd71-11e0-8f9d-f81edfd6bd91)];

Ключом для каждого столбца является timeUUID:

key = TimeUUIDUtils.getUniqueTimeUUIDinMillis();

Часть описания CF:

ColumnFamily: columnFamily
       Key Validation Class: org.apache.cassandra.db.marshal.TimeUUIDType
       Default column value validator: org.apache.cassandra.db.marshal.BytesType
       Columns sorted by: org.apache.cassandra.db.marshal.UTF8Type

Мы также изменили класс проверки ключа для тестирования с помощью BytesType UTF8Type и TimeUUIDType.

В качестве клиента cassandra из Java я использую Hector.

Когда я пытаюсь получить строку, зная, что это id, я не могу ничего получить.

Примеры:

String rowKey = "de80a290-dd71-11e0-8f9d-f81edfd6bd91";
SliceQuery<UUID, String, String> result =HFactory.createSliceQuery(CassandraManager.getKeyspace(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get());
result.setColumnFamily("columnFamily");
result.setKey(UUIDSerializer.get().fromByteBuffer(StringSerializer.get().toByteBuffer(rowKey)));

result.setColumnNames(COLUMNS); //COLUMNS ins a predefined list of colums
QueryResult <ColumnSlice<String, String>> columnSlice = result.execute();
System.out.println(columnSlice.get().getColumnByName(name).getValue());

И результатом является следующее исключение:

me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:Invalid version for TimeUUID type.)
    at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:50)
    at me.prettyprint.cassandra.service.KeyspaceServiceImpl$7.execute(KeyspaceServiceImpl.java:285)
    at me.prettyprint.cassandra.service.KeyspaceServiceImpl$7.execute(KeyspaceServiceImpl.java:268)
    at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:101)
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:232)
    at me.prettyprint.cassandra.service.KeyspaceServiceImpl.operateWithFailover(KeyspaceServiceImpl.java:131)
    at me.prettyprint.cassandra.service.KeyspaceServiceImpl.getSlice(KeyspaceServiceImpl.java:289)
    at me.prettyprint.cassandra.model.thrift.ThriftSliceQuery$1.doInKeyspace(ThriftSliceQuery.java:53)
    at me.prettyprint.cassandra.model.thrift.ThriftSliceQuery$1.doInKeyspace(ThriftSliceQuery.java:49)...

Я также пытался использовать StringSerializer в качестве keySerializer в определении sliceQuery, и я не получаю исключение, но ничего не получается.

Я предполагаю, что мой вопрос в основном "как мне получить строку, запрашивающую ключ?" :)

Кажется, это может быть глупый вопрос, но он сводит меня с ума на несколько дней.

1 Ответ

2 голосов
/ 13 сентября 2011

Эта строка неверна,

result.setKey(UUIDSerializer.get().fromByteBuffer(StringSerializer.get().toByteBuffer(rowKey)));

Вместо этого вы хотите сделать что-то вроде,

result.setKey(java.util.UUID.fromString(rowKey));

StringSerializer.get().toByteBuffer(rowKey)) дает вам байтовый буфер, который содержит rowKey как 36 utf-8 байт,Это не то же самое, что сериализованная форма uuid, которая составляет 16 байтов (длинный msb, затем длинный lsb).

Вероятно, в этом случае вообще не нужно использовать String.Просто используйте TimeUUIDSerializer и com.eaio.uuid.UUID везде в вашем коде.

...