cassandra中的时间序列数据建模

时间:2016-05-04 10:19:51

标签: cassandra cassandra-2.0

我正在尝试存储&以下列方式检索cassandra中的数据:

存储数据 我用以下方式创建了表:

CREATE TABLE mydata (
    myKey TEXT,
    datetime TIMESTAMP,
    value TEXT,
    PRIMARY KEY (myKey,datetime)
);

我将在过去5年中每分钟存储一个值。因此它每行存储1440 * 365 * 5 = 2628000条记录/列(myKey作为行键)。

INSERT INTO mydata(myKey, datetime, value) VALUES ('1234ABCD','2013-04-03 07:01:00','72F');
INSERT INTO mydata(myKey, datetime, value) VALUES ('1234ABCD','2013-04-03 07:02:00','72F');
INSERT INTO mydata(myKey, datetime, value) VALUES ('1234ABCD','2013-04-03 07:03:00','72F');

.................

我能够存储数据并且一切正常。但是,我想知道,如果这是水平进行(存储)数据的有效方式(对于100万个这样的密钥,每个密钥有2628000个值)?

检索数据

以上述格式存储数据后,我可以通过使用一段时间的简单选择查询来选择数据。 例如:

SELECT * 
FROM mydata 
WHERE myKey='1234ABCD' AND datetime > '2013-04-03 07:01:00' AND datetime < '2013-04-03 07:04:00';

查询工作正常,我得到了预期的结果。

但我的问题是:

  1. 如何以特定间隔仅选择这些值。例如,如果我查询一天的数据,我会得到1440个值(每分钟1个)。我希望每10分钟获得一次值(每10分钟一次)限制值。值为144。
  2. 如果我们使用上述存储策略,有没有办法查询表?
  3. 如果没有,有哪些可能的选项可以满足我在1分钟,10分钟,1小时,1天等特定时间间隔查询数据的要求?
  4. 感谢任何其他建议。

2 个答案:

答案 0 :(得分:2)

不,它不对,将来你会遇到问题,因为每行密钥我们只能存储20亿条记录或列。之后它不会给出错误,但它也会存储数据。 对于您的问题,将列时间戳拆分为年,月,日和时间。 喜欢2016年,04年,04年和15点03:00。也可以按年,月,日分区键。

答案 1 :(得分:0)

您肯定需要使用模块化版本的时间戳来绑定分区。但粒度确实取决于你的读数。

如果你主要是每天阅读,那就用这样的PK((myKey,yyyymmdd),时间)

如果主要是周PK((mykey,yyyyww),时间)或月......

问题是,如果你想读一整年的价值,那么你最好每周或每月都有一个分区,或者甚至一年我认为如果你不做任何删除,你的分区大小需要小于100MB