如何根据WRITETIME过滤Cassandra结果

qcuzuvrc  于 11个月前  发布在  Cassandra
关注(0)|答案(1)|浏览(170)

我想获取值,其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

dgsult0t

dgsult0t1#

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引擎存储格式而设计的。如果你没有专门做这件事,那么你不应该使用它。
  • 我在示例中指定了CLUSTERING ORDER,以便按照递减顺序按lastwrittentiles表进行排序。通常,基于时间序列的应用程序关心的是获取最新的数据,因此这通常是有意义的。如果您不是这种情况,那么(默认)递增顺序应该可以。
  • 在我的示例中,我将idx作为最后一个聚类键,主要是为了唯一性。如果你发现自己必须为该列构建查询,你可能需要一个不同的查询表(重新排列主键)来支持它。

要获得这方面的更多帮助,请阅读给予帕特里克麦克法丁的Getting Started With Timeseries Data Modeling

相关问题