1

我有一个带有 TimeUUIDType 比较器的 cassandra 数据库和列系列。我使用 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; 后者只是从你给它的两个 long 中组成一个 uuid,这两个都不是“时间戳”本身。所以:

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

更一般地,当您只需要说“给我结果的第一页”而不必担心这一点时,您可以将 null、null 作为范围的开始/结束传递。

于 2012-06-20T20:12:36.990 回答