我有一个带有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
有什么想法吗?
答案 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)
此错误是因为起始范围大于您使用的查询中的结束范围值。