【问题标题】:Storing time specific data in cassandra在 cassandra 中存储时间特定的数据
【发布时间】:2018-02-02 12:06:24
【问题描述】:

我正在寻找一种在 cassandra 中存储特定时间数据的好方法。

每个条目可能看起来像(start_time, value)。稍后,我想检索当前值。

获取当前值的逻辑如下。

  1. 查找所有带有start_time<=current_time 的行。

  2. 然后从第一步得到的行中找出start_time最大的值。

PS:- 编辑问题以使其更清晰

【问题讨论】:

  • 这是您要执行的查询吗?列出您要执行的所有类型的查询并从中建模您的表
  • 是的,这是我要执行的唯一查询。
  • 你需要所有以前的数据吗?
  • 是的,我需要最近的过去数据

标签: cassandra cassandra-2.0 nosql


【解决方案1】:

确切的要求是不可能的。但是我们可以再增加一列来接近它。

首先,为了能够使用<= 运算符,您的start_time 列需要是您的表的集群键。

然后,您需要一个不同的分区键。您可以选择一个固定值,但是当分区的行数过多时可能会带来问题。那么你最好使用start_time 的年份或月份。

CREATE TABLE time_specific_table (
  year bigint,
  start_time timestamp,
  value text,
  PRIMARY KEY((year), start_time)
) WITH CLUSTERING ORDER BY (start_time DESC);

问题是当你查询表时,你需要知道分区键的值:

查找所有具有 start_time

SELECT * FROM time_specific_table
WHERE year = :year AND start_time <= :time;

选择 start_time 最长的值

SELECT * FROM time_specific_table
WHERE year = :year LIMIT 1;

【讨论】:

  • SELECT * FROM time_specific_table WHERE year = :year; 这部分我不清楚。它将如何给我最大 start_time?
  • 我提到的查询不是独立的。编辑了问题以使其更清楚。谢谢。
  • @Ravi 感谢start_time 列上的DESC CLUSTERING ORDER,您将通过此查询获得start_time 的最高值。
  • 事实上我忘记了一些事情。检索的数据按 start_time 降序排列。所以最大值只是这个结果的第一行。我用LIMIT 1 子句更改了我的回复。
【解决方案2】:

创建两个单独的表,如下所示:

CREATE TABLE data (
    start_time timestamp,
    value int,
    PRIMARY KEY(start_time, value)
);

CREATE TABLE current_value (
    partition int PRIMARY KEY,
    value int
);

现在您必须将数据插入到两个表中,要将数据插入到第二个表中,请使用像 1 这样的静态值

INSERT INTO current_value(partition, value) VALUES(1, 10);

现在在当前值表中,您的数据将被更新,并且您将在您选择时获得最新值。

【讨论】:

  • @Ravi current_value table 将保留最后一次插入
  • 我认为这里的数据表不允许像 start_time
  • @AshrafulIslam 是的,但这不是我想要的。
  • @Ravi 在您的问题中指定了两个逻辑。两者在 cassandra 中的表现都会最差。
  • @AshrafulIslam 我提到的查询不是独立的。编辑了问题以使其更清楚。谢谢。
猜你喜欢
  • 2014-03-23
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多