2016-07-07 12 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なので、最初の2つの行がuser_idを共有しており、3番目の行のuser_idが異なるということは私の推測です(私たちはcurrent_time列で、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)内でのみ意味があります。

つまり、結果セットをソートする場合は、クエリでWHERE句にuser_idパーティションキーを指定する必要があります。あなたはこのよりよく理解するのに役立つかもしれ

自己宣伝か何かに

ないが、私は昨年の初め、このテーマに関する記事を書いた、:

PlanetCassandra: We Shall Have Order!

0

current_timeはタイプtextのようにソートされています日付文字列の文字に基づいて行われます。

current_timeのタイプをtimestampに変更してください。