我想获取值,其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](...)">
对于此表:
CREATE TABLE tiles (
zoom int,
idx int,
tile blob,
PRIMARY KEY (zoom, idx)
) WITH COMPACT STORAGE
答案 0 :(得分:8)
WRITETIME
是用于显示特定列的写入时间的函数。它不是PRIMARY KEY的一部分,也不是索引,因此不能在WHERE子句中使用它。为了能够在编写特定的行(而不是列)时进行查询,您应该将其作为附加列和添加到表中作为第一个群集键:
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:stackoverflow2> 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可以从所有节点中提取所有表的行,然后应用过滤器。COMPACT STORAGE
。这是专为人们将新的CQL3表转换为传统的Thrift引擎存储格式而设计的。如果您没有专门 ,那么就不应该使用它。tiles
对lastwritten
表进行排序。通常,基于时间序列的应用程序关心获取最新数据,因此这通常是有意义的。如果您不是这种情况,则(默认)ASCending订单应该没问题。idx
作为最后一个聚类键,主要用于唯一性。如果您发现自己必须为该列构建查询,则可能需要使用不同的查询表(使用重新排列的主键)来支持该列。要获得此领域的更多帮助,请给Patrick McFadin Getting Started With Timeseries Data Modeling阅读。