2014-11-21 79 views
0

C *中的时间序列建模很简单,但如果您想添加一些粒度,该怎么办?Suss时间序列数据的Cassandra数据模型

我们有一个表,看起来像

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 *无法做到这一点,但不知何故,这可以,对吧?

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

回答

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 
+0

嗨,感谢您的答复,但是就我而言,我们仍然会选择数千行而不是每小时只有几行,对吧? – 2014-11-22 23:13:30

+0

嗨迈克尔Hirn,抱歉,答案是不够的。我想我不明白你的问题,并添加了一个例子。希望一些讨论导致解决方案。 – catpaws 2014-11-23 01:13:08

+0

感谢您的回复如此之快,我用一个例子更新了问题,并且现在问题如何变得更加清晰。 – 2014-11-23 10:05:40