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 列上的切片查询的主要内容,如果未能解决你的问题,请参考以下文章

DataFrame查询2 - 专用查询:索引和切片

存储切片的接口上的范围

Numpy之ndarray的查询和修改 - 索引和切片

Cassandra,查询主键,跳过聚类列(timeuuid)

覆盖自定义对象上的切片(Python)[重复]

MongoDB 查询 - 返回切片数组