1

TimeUUIDTypeコンパレーターを備えたcassandra dbと列ファミリーがあります。私はHectorを使用し、RandomPartitionerを使用してキースペースを持っています。

TimeUUID で並べ替えられたページング可能な結果を​​取得するスライス クエリを作成したいと思います。

SliceQuery<String, UUID, UserLike> query = HFactory.createSliceQuery(getKeyspace(), StringSerializer.get(), TimeUUIDSerializer.get(), UserLikesSerializer.get());
query = query.setKey(username);
query.setColumnFamily(SOME_CF);

このコードでクエリを構成すると:

 query.setRange(new UUID(UUIDGen.createTime(Long.MAX_VALUE),UUIDGen.getClockSeqAndNode()), null, true, maxResults);

私は間違った順序でデータを取得します (おそらく RandomPartitioner を使用しているためです - 正しいですか?) 次のコードでクエリを構成すると:

query.setRange(new UUID(UUIDGen.createTime(Long.MAX_VALUE),UUIDGen.getClockSeqAndNode()), new UUID(UUIDGen.createTime(0),UUIDGen.getClockSeqAndNode()), true, maxResults);

エラーが発生します:

InvalidRequestException(why:range finish must come after start in the order of traversal)
at me.prettyprint.hector.api.exceptions.HInvalidRequestException

何か案は ?

4

2 に答える 2

1

このエラーは、使用したクエリの開始範囲が終了範囲の値よりも大きいために発生します。

于 2013-07-25T11:14:55.433 に答える
1

まず、このエラーが表示されるのは、 ;getTimeUUIDBytesの代わりに ,を使用する必要があるためです。new UUID後者は、指定した 2 つの long から uuid を構成するだけであり、どちらも「タイムスタンプ」自体ではありません。そう:

query.setRange(UUIDGen.getUUID(UUIDGen.getTimeUUIDBytes(Long.MAX_VALUE)), null, true, maxResults);

より一般的には、「結果の最初のページをください」と言う必要があり、これについて心配する必要がない場合は、範囲の開始/終了として null, null を渡すことができます。

于 2012-06-20T20:12:36.990 に答える