2016-07-13 80 views
3

我每秒插入〜8行,並且我希望有一個包含所有行的大表,並且我希望每週將此表分區成許多表。 e.gCan Cassandra分區表嗎?

select * from keyspace.rootTable; -> returns all rows from all tables 
select * from keyspace.27-2016Table -> return all rows from week 27 
+0

只有當星期是密鑰的第一部分。 – OrangeDog

+0

可能最好有一個表,並在分區鍵中包含星期。 –

回答

3

在每天86400秒,每週604800秒,你會被存儲每天691200行和每星期4838400行。即使不知道你的行有多寬,但是在單個查詢中返回的結果太多了。 Cassandra非常適合存儲大量這樣的數據。但是查詢很多像這樣的數據...並不是那麼多。

你可能想按小時分區,但即使這樣也會給你28800行。這至少是可以管理的,所以讓我們繼續。

我會建立在week表看起來像這樣,分區和hourBucket而聚集在writeTime

CREATE TABLE youAreAskingCassandraForTooManyRows (
    week text, 
    hourBucket text, 
    writeTime timestamp, 
    value text, 
    PRIMARY KEY ((week,hourBucket),writeTime)) 
WITH CLUSTERING ORDER BY (writeTime DESC); 

然後,我可以通過一個特定的星期和小時查詢,只要按分區鍵:

[email protected]:stackoverflow> SELECT * 
    FROM youareaskingcassandrafortoomanyrows 
    WHERE week='201607-3' AND hourBucket ='20160713-14'; 

week  | hourBucket | writetime    | value 
----------+--------------+--------------------------+-------- 
201607-3 | 20160713-14 | 2016-07-13 14:01:18+0000 | value6 
201607-3 | 20160713-14 | 2016-07-13 14:01:14+0000 | value5 
201607-3 | 20160713-14 | 2016-07-13 14:01:12+0000 | value4 
201607-3 | 20160713-14 | 2016-07-13 14:01:10+0000 | value3 
201607-3 | 20160713-14 | 2016-07-13 14:01:07+0000 | value2 
201607-3 | 20160713-14 | 2016-07-13 14:01:04+0000 | value1 

(6 rows) 

甚至對於特定的範圍,基於羣集密鑰writetime

[email protected]:stackoverflow> SELECT * 
    FROM youareaskingcassandrafortoomanyrows 
    WHERE week='201607-3' AND hourBucket ='20160713-14' 
    AND writetime > '2016-07-13 14:01:05+0000' 
    AND writetime < '2016-07-13 14:01:18+0000'; 

week  | hourBucket | writetime    | value 
----------+--------------+--------------------------+-------- 
201607-3 | 20160713-14 | 2016-07-13 14:01:14+0000 | value5 
201607-3 | 20160713-14 | 2016-07-13 14:01:12+0000 | value4 
201607-3 | 20160713-14 | 2016-07-13 14:01:10+0000 | value3 
201607-3 | 20160713-14 | 2016-07-13 14:01:07+0000 | value2 

(4 rows) 
select * from keyspace.rootTable; -> returns all rows from all tables 

應該不用說,如果我想查詢一整個星期的價值400萬加行會如此巨大,它會超時,然後查詢您的整個表是一個紀念糟糕的主意。

重要的是要注意,卡桑德拉不是一個關係數據庫。它是一個分佈式系統,因此運行未綁定的查詢(沒有WHERE子句的查詢)將大量網絡時間引入您的等式中。這就是爲什麼你總是希望指定至少分區鍵與所有SELECT查詢,因爲這樣你就可以保證你會從單個節點滿足該查詢。

你應該看看Patrick McFadin的文章Getting Started with Time Series Data Modeling。這應該有助於你理解如何分割這樣的數據,並讓你走上正確的道路。