当前位置: 首页 > 知识库问答 >
问题:

Cassandra时间序列排序

蓬野
2023-03-14

我将我的数据存储在卡珊德拉·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);

然后我使用从bidding_user限制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个答案

鄢雅畅
2023-03-14

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

尝试将current_time的类型更改为timemark

巫马劲
2023-03-14
SELECT * FROM bidding_user LIMIT 5;

这里的问题是,您没有指定< code>WHERE子句。Cassandra只维护分区键内的排序顺序。您的分区键是< code>user_id,所以我猜(因为您只显示了< code>current_time列,而不是< code>user_id)是您的前两行共享一个< code>user_id,而第三行的< code>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)中有意义。

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

不是自我推销什么的,但我去年早些时候写过一篇关于这个主题的文章,可能会帮助你更好地理解这一点:

卡珊德拉星球:我们会有秩序的!

 类似资料:
  • 我正在研究一个用于存储时间序列的卡桑德拉数据模型(我是卡桑德拉新手)。我有两个应用程序:日内股票数据和传感器数据。 库存数据将以一分钟的时间分辨率保存。七个数据字段构建一个时间框架:符号、日期时间、开盘、高位、低位、收盘、成交量 我将主要通过符号和日期来查询数据。例如,给我2013年1月1日到2013年1月31日之间按日期时间排序的AAPL的所有数据。cassandra查询的建议是查询整列。所以你

  • 或者,如果有一个更好的方式或存储事件的时间序列数据。

  • 编辑:我已经更改了模式,以便做出一些澄清。 每天都会为当天创建一个新表。所以一个表只包含一天的日志。 我的查询条件如下。 查询特定用户在特定日期(日期而不是时间)的所有日志。 因此原因、项目、价格和计数根本不会用作查询的提示或条件。

  • 我是Cassandra的新手,我想在Cassandra中存储加权图的时间序列,其中边权值随时间而增加,但也随时间而更新。例如, 我的第一个镜头涉及两个CQL v3表: 这个策略有什么可怕的低效吗?应该怎么做?我已经知道表2的更新过程不是幂等的,可能会导致不一致,但我暂时可以接受这一点。 edit:我可以做的一件事是将这两个表合并到一个时间序列表中。

  • 我想查询cassandra timestamp列,例如this hour、last hour、beather。 我在mysql中执行了与昨天数据相同的查询

  • 使用Cassandra 2.28,Drive 3,Sparks2。我在Cassandra中有一个timestamp列,我只需要按日期部分查询它。如果我按日期查询:<代码>。其中(“交易日期=?”,“2012-01-21”:它不会带来任何结果。如果我包括时间部分,它会显示无效日期。我的数据(如我在cqlsh中所读)是:2012-01-21 08:01:00 0000 参数:“2012-01-21”