我插入到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作为keySerializer在sliceQuery定义,我没有得到一个异常,但没有结果。
我想我的问题基本上是"我如何检索行查询的关键?":)
这似乎是一个愚蠢的问题,但却让我抓狂了好几天。
这一行不对,
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的序列化形式不同,uuid是16字节(先是长msb,然后是长lsb)。
在这种情况下可能根本不需要使用String。只需在代码的任何地方使用TimeUUIDSerializer和com.eaio.uuid.UUID。