使用Hector通过cassandra的键检索行

时间:2011-09-12 23:51:29

标签: cassandra hector

我正在插入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进行测试。

作为Java的cassandra客户端,我正在使用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作为sliceQuery定义中的keySerializer,我没有得到Exception但没有结果。

我想我的问题基本上是“如何通过密钥检索行查询?” :)

这似乎是一个愚蠢的问题但是让我疯狂了几天。

1 个答案:

答案 0 :(得分:2)

这一行错了,

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

相反,你想做类似的事情,

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

StringSerializer.get().toByteBuffer(rowKey))给你一个bytebuffer,其中包含rowKey为36 utf-8字节。这与uuid的序列化形式不同,后者是16个字节(长msb,然后是长lsb)。

在这种情况下,根本不需要使用String。只需在代码中的任何地方使用TimeUUIDSerializer和com.eaio.uuid.UUID。