Cassandra可以分区表吗?

时间:2016-07-13 13:27:07

标签: cassandra cql database nosql

我每秒插入~8行,我希望有一个包含所有行的大表,我想每周将这个表分成许多表。 e.g

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

1 个答案:

答案 0 :(得分:3)

每天86400秒,每周604800秒,每天存储691200行,每周存储4838400行。即使不知道行的宽度,在单个查询中返回的数量也太多了。 Cassandra非常适合存储大量这样的数据。但是查询这样的大量数据......不是那么多。

您可能希望按小时分区,但即使这样也会给您28800行。这至少是半可管理的,所以让我们继续。

我会构建一个看起来像这样的表,在week上进行分区时hourBucketwriteTime进行分区:

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的文章。这应该有助于您了解如何对这样的数据进行分区,并让您走上正确的道路。

相关问题