如何根据 WRITETIME 过滤 Cassandra 结果

问题描述 投票:0回答:1

我想获取 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
cassandra cql
1个回答
14
投票

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,以按降序对
    tiles
    表进行排序。通常,基于时间序列的应用程序关心获取最新数据,因此这通常是有意义的。如果您不是这种情况,那么(默认)ASCending 顺序应该没问题。
    在我的示例中,我将 
  • lastwritten
  • 作为最后一个聚类键,主要是为了唯一性。如果您发现自己必须为该列构建查询,则可能需要不同的查询表(具有重新排列的主键)来支持它。
    
    
  • 如需此领域的更多帮助,请阅读 Patrick McFadin 的
时间序列数据建模入门

© www.soinside.com 2019 - 2024. All rights reserved.