2016-07-07 113 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