2014-11-21 86 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