Cassandra 时间序列排序
Cassandra Time Series sort
我使用以下架构将数据存储在 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.
我认为数据库忽略了日期而只关心时间。
知道如何解决这个问题吗?
SELECT * FROM bidding_user LIMIT 5;
这里的问题是您没有指定 WHERE
子句。 Cassandra 仅维护分区键内的排序顺序。您的分区键是 user_id
,所以我的猜测(因为您只向我们展示了 current_time
列,而不是 user_id
)是您的前两行共享一个 user_id
, 第三行的 user_id
不同。
考虑以下 table:
CREATE TABLE Whosebug.timestamptest (
userid text,
activetime timestamp,
value text,
PRIMARY KEY (userid, activetime)
) WITH CLUSTERING ORDER BY (activetime ASC)
如果我在没有 WHERE 子句的情况下进行查询,我得到:
aploetz@cqlsh:Whosebug> 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
分区键。
不是为了自我推销什么的,但我去年年初写了一篇关于这个主题的文章,这可能有助于你更好地理解这一点:
current_time
是 text
类型,因此根据日期字符串的字符进行排序。
尝试将 current_time
的类型更改为 timestamp
。
我使用以下架构将数据存储在 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.
我认为数据库忽略了日期而只关心时间。
知道如何解决这个问题吗?
SELECT * FROM bidding_user LIMIT 5;
这里的问题是您没有指定 WHERE
子句。 Cassandra 仅维护分区键内的排序顺序。您的分区键是 user_id
,所以我的猜测(因为您只向我们展示了 current_time
列,而不是 user_id
)是您的前两行共享一个 user_id
, 第三行的 user_id
不同。
考虑以下 table:
CREATE TABLE Whosebug.timestamptest (
userid text,
activetime timestamp,
value text,
PRIMARY KEY (userid, activetime)
) WITH CLUSTERING ORDER BY (activetime ASC)
如果我在没有 WHERE 子句的情况下进行查询,我得到:
aploetz@cqlsh:Whosebug> 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
分区键。
不是为了自我推销什么的,但我去年年初写了一篇关于这个主题的文章,这可能有助于你更好地理解这一点:
current_time
是 text
类型,因此根据日期字符串的字符进行排序。
尝试将 current_time
的类型更改为 timestamp
。