按日期检索行:cassandra

时间:2015-10-22 12:34:25

标签: cassandra cql

在数据中有一列时间戳,带有模式:

YEAR-MM-DD hour:minute:second

我想检索此时间戳列日期的行,例如是> 2015年7月1日

我不想比较时间,只是比较日期。 我试过了:

SELECT * FROM table_name where timestamp >= '2015-10-01' limit 10;

但是没有给出期望的输出。

2 个答案:

答案 0 :(得分:1)

问题是,如果列不是分区键或索引的列,则无法使用列过滤数据。

使用关键字 allow filtering 来对列进行聚类是个例外。

有关详细信息,请参阅Datastax documentation

答案 1 :(得分:1)

这里的一个问题是,在允许任何其他类型的条件之前,Cassandra需要EQ条件(IN也可以工作,但我不建议这样做)在第一个分区键上(<,> ;等)。其他解决方案,如使用ALLOW FILTERING或索引,可以“工作”,#34;但它们不会大规模执行,也不会以任何顺序返回行。

Cassandra只能在分区键中强制执行排序顺序。例如,这意味着您可以根据clustering column的特定值,选择第一个partition key中具有特定日期/时间值的行。

示例:

CREATE TABLE stackoverflow.timestamptest (
    userid text,
    activetime timestamp,
    value text,
    PRIMARY KEY (userid, activetime)
) WITH CLUSTERING ORDER BY (activetime ASC)

aploetz@cqlsh:stackoverflow> SELECT * FROm timestamptest 
                             WHERE userid='a' AND activetime > '2015-09-25';                
 userid | activetime               | value
--------+--------------------------+---------
      a | 2015-09-25 06:33:33-0500 |  value1
      a | 2015-09-25 06:34:33-0500 |  value2
      a | 2015-10-22 09:26:00-0500 |  value3

(3 rows)

基本上,您需要以对您的应用程序和查询要求有意义的方式对表进行进一步分区。

对于许多Cassandra开发者而言,这往往是一个令人困惑的问题,因此我在今年早些时候为DataStax撰写的文章中添加了一个链接:We Shall Have Order!