2017-08-24 75 views
0

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

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

检索当前值的逻辑如下。

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

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

PS: - 编辑的问题,使之更加明确

+0

这是您要执行的一个查询吗?列出您想要执行的所有类型的查询并为其建模 –

+0

是的,这是我想要执行的唯一查询。 – Ravi

+0

你需要以前的所有数据吗? –

回答

0

创建两个单独的表象下面这样:

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); 

现在在当前值表中,您的数据将被置顶,每当您选择时您将获得最新值。

+0

如果我输入未来的时间戳,它会起作用吗? – Ravi

+0

@Ravi current_value表将保留最后一个插入 –

+0

我认为在这里数据表将不允许像start_time <= current_time这样的查询。 –

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 < = CURRENT_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; 
+0

'SELECT * FROM time_specific_table WHERE year =:year;'这部分对我来说不是很清楚。它如何给我最大的start_time? – Ravi

+0

我提到的查询不是独立的。编辑该问题以使其更加清晰。谢谢。 – Ravi

+0

@Ravi感谢'start_time'列上的'DESC'' CLUSTERING ORDER',您将通过此查询获得最高的'start_time'值。 –