3

私は 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)...

また、sliceQuery 定義の keySerializer として StringSerializer を使用してみましたが、例外は発生しませんが、結果は得られません。

私の質問は基本的に「キーでクエリを実行して行を取得するにはどうすればよいですか?」ということだと思います。:)

ばかげた質問かもしれませんが、数日間私を夢中にさせています.

4

1 に答える 1

2

この行は間違っています。

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

代わりに、次のようなことをしたい

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

StringSerializer.get().toByteBuffer(rowKey))rowKey を 36 utf-8 バイトとして含む bytebuffer を提供します。これは、シリアル化された形式の uuid と同じではありません。これは 16 バイトです (長い msb の次に長い lsb)。

この場合、おそらく文字列を使用する必要はまったくありません。コードのどこでも TimeUUIDSerializer と com.eaio.uuid.UUID を使用するだけです。

于 2011-09-13T04:09:18.240 に答える