卡桑德拉时间序列排序

时间:2016-07-07 19:10:26

标签: cassandra time-series cql

我使用以下架构将我的数据存储在Cassandra NoSQL数据库中:

CREATE TABLE bidding3(
    item_id bigint,
    user_id bigint,
    bid_price bigint,
    current_time text,
    PRIMARY KEY (item_id,current_time)
) WITH CLUSTERING ORDER BY (current_time,DESC);


CREATE TABLE bidding_user(
    item_id bigint,
    user_id bigint,
    bid_price bigint,
    current_time text,
    PRIMARY KEY (user_id,current_time)
) WITH CLUSTERING ORDER BY (current_time,DESC);

然后我用 SELECT * FROM bidding_user LIMIT 5;。 我希望数据按时间顺序排列,并且在第一天就完成了,但今天事情发生了变化。

Wed Jul 06 20:09:04 UTC 2016
Wed Jul 06 19:10:04 UTC 2016
Thu Jul 07 19:09:04 UTC 2016.

我认为数据库会忽略日期,但只关心时间。

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

SELECT * FROM bidding_user LIMIT 5;

这里的问题是你没有指定WHERE子句。 Cassandra仅维护分区键中的排序顺序。您的分区键是user_id,因此我的猜测(因为您只向我们显示current_time列,而不是user_id)是您的前两行共享user_id ,第三行的user_id不同。

考虑下表:

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

如果我在没有WHERE子句的情况下进行查询,我会得到:

aploetz@cqlsh:stackoverflow> SELECT userid,activetime FROM timestamptest ;

 userid | activetime
--------+--------------------------
      a | 2015-09-25 11:33:33+0000
      a | 2015-10-22 14:26:00+0000
      c | 2015-12-28 19:12:00+0000
      d | 2016-01-22 14:57:54+0000
      d | 2016-01-22 14:57:54+0000
      d | 2016-07-07 19:44:04+0000
      b | 2015-10-22 14:26:00+0000
      b | 2016-07-07 19:44:10+0000

(8 rows)

如您所见,我的群集密钥(activetime)的顺序实际上只在每个分区键(userid)中有意义。

换句话说,如果您希望对结果集进行排序,则需要在查询的user_id子句中指定WHERE分区键。

不要自我宣传或任何事情,但去年年初我写了一篇关于这个主题的文章,这可能有助于你更好地理解这一点:

PlanetCassandra: We Shall Have Order!

答案 1 :(得分:0)

current_time的类型为text,因此根据日期字符串的字符进行排序。

尝试将current_time的类型更改为timestamp

相关问题