对TimeUUID列进行切片查询

时间:2012-06-19 19:46:19

标签: cassandra uuid slice

我有一个带有TimeUUIDType比较器的cassandra db和column系列。我使用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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

首先,您发现此错误是因为您需要使用getTimeUUIDBytes,而不是new UUID;后者只是从你给它的两个长篇中组成一个uuid,其中没有一个是&#34;时间戳&#34;本身。所以:

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

更一般地说,你可以传递null,null作为范围的开始/结束,当你只需要说&#34;给我第一页结果&#34;而不必担心这个。

答案 1 :(得分:1)

此错误是因为起始范围大于您使用的查询中的结束范围值。