2016-07-07 116 views
2

我存储我的卡珊德拉的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. 

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

任何想法如何解决这个问题?

回答

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子句,我得到:

[email protected]: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!

0

current_timetext型的,排序是根据日期字符串的字符完成。

尝试将current_time的类型更改为timestamp