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

时间:2014-11-21 00:01:00

标签: cassandra cql

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 *不能开箱即用,但不管怎样,这可以,对吧?

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

1 个答案:

答案 0 :(得分:0)

也许类似"Time Series Pattern 2 Partitioning to limit row size"的东西,但是使用一年中的一周而不是一年中的某一天,这对你有用。也许你可以使用一些Cassandra功能来分析本页描述的分区行的粒度:http://www.datastax.com/documentation/cql/3.1/cql/cql_using/use-slice-partition.html。例如:


    CREATE TABLE sales (
      c_id text,
      purchased_at timestamp,
      revenue_cents bigint,
      week int,
      PRIMARY KEY ((c_id, week), purchased_at)
    );

使用composite PRIMARY KEY定义会将所有数据分组一周。


    INSERT INTO sales (c_id, week, purchased_at, revenue_cents) VALUES ('wholesale', 50, '2014-12-15 07:01:00', 1234804938237367);
    INSERT INTO sales (c_id, week, purchased_at, revenue_cents) VALUES ('retail', 50, '2014-12-17 08:01:00', 253480493823736700);
    INSERT INTO sales (c_id, week, purchased_at, revenue_cents) VALUES ('retail', 51, '2014-12-22 20:01:00', 3480493823736700);
    INSERT INTO sales (c_id, week, purchased_at, revenue_cents) VALUES ('retail', 50, '2014-12-16 10:01:00', 250480493823736700);

    SELECT *
    FROM sales
    WHERE c_id='retail'
    AND week=50;

     c_id   | week | purchased_at             | revenue_cents
    --------+------+--------------------------+--------------------
     retail |   50 | 2014-12-16 10:01:00-0800 | 250480493823736700
     retail |   50 | 2014-12-17 08:01:00-0800 | 253480493823736700