我每秒插入~8行,我希望有一个包含所有行的大表,我想每周将这个表分成许多表。 e.g
select * from keyspace.rootTable; -> returns all rows from all tables
select * from keyspace.27-2016Table -> return all rows from week 27
答案 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);
然后我可以通过分区键来查询特定的一周和一小时:
aploetz@cqlsh: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
。
aploetz@cqlsh: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万行的行将是如此巨大以至于超时,那么查询整个表格就是一个的纪念性坏主意。
重要的是要注意,Cassandra不是关系数据库。它是一个分布式系统,因此运行未绑定的查询(没有WHERE子句的查询)会在您的等式中引入大量的网络时间。这就是为什么你总是希望用所有SELECT查询指定至少分区键,因为这样你就可以保证你将从单个节点满足那个查询。
你应该看看Patrick McFadin关于Getting Started with Time Series Data Modeling的文章。这应该有助于您了解如何对这样的数据进行分区,并让您走上正确的道路。