我每秒插入〜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
我每秒插入〜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
在每天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。這應該有助於你理解如何分割這樣的數據,並讓你走上正確的道路。
只有當星期是密鑰的第一部分。 – OrangeDog
可能最好有一個表,並在分區鍵中包含星期。 –