TimeUUID 列上的切片查询
Posted
技术标签:
【中文标题】TimeUUID 列上的切片查询【英文标题】:Slice query on TimeUUID columns 【发布时间】:2012-06-19 19:46:19 【问题描述】:我有一个带有 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
有什么想法吗?
【问题讨论】:
【参考方案1】:首先,您看到此错误是因为您需要使用getTimeUUIDBytes
,而不是new UUID
;后者只是从你给它的两个 long 中组成一个 uuid,这两个都不是“时间戳”本身。所以:
query.setRange(UUIDGen.getUUID(UUIDGen.getTimeUUIDBytes(Long.MAX_VALUE)), null, true, maxResults);
更一般地,当您只需要说“给我结果的第一页”而不必担心这一点时,您可以将 null、null 作为范围的开始/结束传递。
【讨论】:
不完全是。是时间跨度的问题(我的意思是值 Long.MAX_VALUE)。我用 System.currentTimeInMillis() 替换了它,现在它就像一个魅力【参考方案2】:此错误是因为您使用的查询中的开始范围大于结束范围值。
【讨论】:
以上是关于TimeUUID 列上的切片查询的主要内容,如果未能解决你的问题,请参考以下文章