用于求和时间序列数据的 Cassandra 数据模型


C

* 中的时间序列建模很容易,但如果你想添加一些粒度怎么办?

我们有一个看起来像这样的表格

CREATE TABLE sales (
  c_id text,
  purchased_at timestamp,
  revenue_cents integer,
  PRIMARY KEY (channel_id, purchased_at)
);

现在,我们想选择过去 365 天内的所有销售,并将时间造粒设置为一周。我们可以在前端进行总结,但就我们选择数十万行而言,这似乎有点不性能,尤其是在选择速度最重要的情况下。

举个小例子:
在我们的sales表中,我们插入以下销售额

INSERT INTO sales (c_id, purchased_at, revenue_cents) VALUES (1, '2014-12-15 07:01:00', 200);
INSERT INTO sales (c_id, purchased_at, revenue_cents) VALUES (1, '2014-12-17 08:01:00', 400);
INSERT INTO sales (c_id, purchased_at, revenue_cents) VALUES (1, '2014-12-24 20:01:00', 400);
INSERT INTO sales (c_id, purchased_at, revenue_cents) VALUES (1, '2014-12-16 10:01:00', 600);

这些每天可能有数千笔销售,所以如果我们想制作一个图表来说明去年的收入,请使用这样的查询:

SELECT revenue_cents FROM sales WHERE c_id='1' AND purchased_at > '2014-01-01 00:00:00';

我们会像一百万行一样返回,这还不够快。我们也不知道每次销售时的信息,我们只需要在第 225 天(例如第 44 周或第 6 个月)赚了多少钱的信息。因此,如果我们运行上面的查询并希望它以某种方式按月分组,我们将返回 11/12 行,并且revenue_cents都汇总了。我知道 C* 不能开箱即用,但不知何故可以,对吧?

因此,我的问题是,如何实现这一目标?

也许类似于"时间序列模式 2 分区以限制行大小"的东西,但使用一年中的一周而不是一年中的某一天作为日期,对您有用。也许您可以使用一些 Cassandra 功能来实现此页面上描述的分区行切片的粒度:http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use-slice-partition.html。例如:

   创建表销售 (      c_id文本,      purchased_at时间戳,      revenue_cents比金特,      周内,      主键((c_id、周)、purchased_at)    );

使用复合主键定义将对一周的所有数据进行分组。

   插入销售(c_id、周、purchased_at、revenue_cents)值("批发",50,'2014-12-15 07:01:00',1234804938237367);    插入销售(c_id、周、purchased_at、revenue_cents)值("零售",50,'2014-12-17 08:01:00',253480493823736700);    插入销售(c_id、周、purchased_at、revenue_cents)值("零售",51,"2014-12-22 20:01:00",3480493823736700);    插入销售(c_id、周、purchased_at、revenue_cents)值("零售",50,'2014-12-16 10:01:00',250480493823736700);    选择*    从销售    其中c_id='零售'    和周=50;     c_id |周 |purchased_at |revenue_cents    --------+------+--------------------------+--------------------     零售 |  50 |2014-12-16 10:01:00-0800 |250480493823736700     零售 |  50 |2014-12-17 08:01:00-0800 |253480493823736700

最新更新