如何根据 WRITETIME 过滤 Cassandra 结果
How to filter Cassandra result based on WRITETIME
我想获取值,其 WRITETIME 值比某个时间更新。我试过这个查询,但它失败了:
SELECT zoom,idx FROM tiles
WHERE zoom=5 AND writetime(tile) > maxTimeuuid('2015-01-01 00:05+0000')
ALLOW FILTERING;
我收到这个错误:
SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query]
message="line 1:68 no viable alternative at input '(' (...and idx > 0
and [writetime](...)">
为此table:
CREATE TABLE tiles (
zoom int,
idx int,
tile blob,
PRIMARY KEY (zoom, idx)
) WITH COMPACT STORAGE
WRITETIME
是一个函数,用于显示特定列的写入时间。它不是 PRIMARY KEY 的一部分,也没有索引,因此不能在 WHERE 子句中使用。为了能够在写入特定 行(不是列)时进行查询,您应该将其添加到 table 作为附加列 and 作为您的第一个集群键:
CREATE TABLE tilesByLastWritten (
zoom int,
idx int,
tile blob,
lastwritten timeuuid,
PRIMARY KEY (zoom, lastwritten, idx)
) WITH CLUSTERING ORDER BY (lastwritten DESC, idx ASC);
现在这个查询可以工作了:
aploetz@cqlsh:Whosebug2> SELECT * FROM tilesByLastWritten
WHERE zoom=5 AND lastwritten > mintimeuuid('2015-07-02 08:30:00-0500');
zoom | lastwritten | idx | tile
------+--------------------------------------+-----+------
5 | 3a439c60-20bf-11e5-b9cb-21b264d4c94d | 1 | null
(1 rows)
备注:
- 不要使用
ALLOW FILTERING
指令。基本上这告诉 Cassandra 可以从所有节点中提取所有 table 的行,然后应用过滤器。
- 不要在 table 创建时使用
COMPACT STORAGE
。这是专门为人们将新的 CQL3 tables 转换为旧版 Thrift 引擎存储格式而设计的。如果您没有具体,那么您不应该使用它。
- 我在示例中指定了 CLUSTERING ORDER,以按
lastwritten
降序对 tiles
table 进行排序。通常,基于时间序列的应用程序关心获取最新数据,因此这通常是有道理的。如果您不是这种情况,那么(默认)升序应该没问题。
- 在我的示例中,我将
idx
作为最后一个聚类键,主要是为了唯一性。如果您发现自己必须为该列构建查询,您可能需要一个不同的查询 table(使用重新排列的主键)来支持它。
如需这方面的更多帮助,请阅读 Patrick McFadin 的 Getting Started With Timeseries Data Modeling。
我想获取值,其 WRITETIME 值比某个时间更新。我试过这个查询,但它失败了:
SELECT zoom,idx FROM tiles
WHERE zoom=5 AND writetime(tile) > maxTimeuuid('2015-01-01 00:05+0000')
ALLOW FILTERING;
我收到这个错误:
SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query]
message="line 1:68 no viable alternative at input '(' (...and idx > 0
and [writetime](...)">
为此table:
CREATE TABLE tiles (
zoom int,
idx int,
tile blob,
PRIMARY KEY (zoom, idx)
) WITH COMPACT STORAGE
WRITETIME
是一个函数,用于显示特定列的写入时间。它不是 PRIMARY KEY 的一部分,也没有索引,因此不能在 WHERE 子句中使用。为了能够在写入特定 行(不是列)时进行查询,您应该将其添加到 table 作为附加列 and 作为您的第一个集群键:
CREATE TABLE tilesByLastWritten (
zoom int,
idx int,
tile blob,
lastwritten timeuuid,
PRIMARY KEY (zoom, lastwritten, idx)
) WITH CLUSTERING ORDER BY (lastwritten DESC, idx ASC);
现在这个查询可以工作了:
aploetz@cqlsh:Whosebug2> SELECT * FROM tilesByLastWritten
WHERE zoom=5 AND lastwritten > mintimeuuid('2015-07-02 08:30:00-0500');
zoom | lastwritten | idx | tile
------+--------------------------------------+-----+------
5 | 3a439c60-20bf-11e5-b9cb-21b264d4c94d | 1 | null
(1 rows)
备注:
- 不要使用
ALLOW FILTERING
指令。基本上这告诉 Cassandra 可以从所有节点中提取所有 table 的行,然后应用过滤器。 - 不要在 table 创建时使用
COMPACT STORAGE
。这是专门为人们将新的 CQL3 tables 转换为旧版 Thrift 引擎存储格式而设计的。如果您没有具体,那么您不应该使用它。 - 我在示例中指定了 CLUSTERING ORDER,以按
lastwritten
降序对tiles
table 进行排序。通常,基于时间序列的应用程序关心获取最新数据,因此这通常是有道理的。如果您不是这种情况,那么(默认)升序应该没问题。 - 在我的示例中,我将
idx
作为最后一个聚类键,主要是为了唯一性。如果您发现自己必须为该列构建查询,您可能需要一个不同的查询 table(使用重新排列的主键)来支持它。
如需这方面的更多帮助,请阅读 Patrick McFadin 的 Getting Started With Timeseries Data Modeling。