cassandra - Cassandra 可以分区表吗?

标签 cassandra cql database nosql

我每秒插入约 8 行,我想要一个包含所有行的大表,并且我想每周将这个表分成许多表。 例如

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 行。这至少是半可控的,所以让我们开始吧。

我会构建一个如下所示的表,在 weekhourBucket 上进行分区,同时在 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 不是关系数据库。它是一个分布式系统,因此运行未绑定(bind)查询(没有 WHERE 子句的查询)会在您的等式中引入大量网络时间。这就是为什么您总是希望为所有 SELECT 查询指定至少一个分区键,因为这样您就可以保证从单个节点满足该查询。

您应该看看 Patrick McFadin 关于 Getting Started with Time Series Data Modeling 的文章.这应该可以帮助您了解如何像这样对数据进行分区,并让您走上正确的道路。

关于cassandra - Cassandra 可以分区表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38353113/

相关文章:

php - mysql查询: retrieve current date query

php - 使用 symfony/propel 进行增量更新

java - 如何在 Cassandra 中使用 Spark 获取行范围

merge - 当 KEY 已作为批处理存在时,Cassandra 更新或插入

cassandra - 在 Cassandra 中创建的分区数

ios - 如何获取iOS核心数据中每个实体的最后一个条目

json - 使用 map 和列表列将非规范化表导出到cassandra表

apache-spark - 如何将RDD复制到多个RDD中?

ubuntu - cassandra.service 启动失败 : Unit cassandra. 找不到服务

java - 如何在 CQL 3 准备语句中绑定(bind) IN 子句值?