表中Cassandra支持的最大列数

时间:2018-09-04 05:02:42

标签: database-design cassandra time-series

我能够设计一个表来存储单个时间序列数据。

CREATE TABLE timeseries( partition bitint, timestamps bigint, key text, value text, PRIMARY KEY((partition,key),timestamps);

分区本身是时间戳的函数(例如:除法)。 这将一次存储一个键的单个值。

如果我们需要一次针对一个键存储约1000个值,该怎么办。将有value_1,value_2,... value_1000。也就是说,表格中还有1000个字段。

CREATE TABLE timeseries(partition bitint,timestamps bigint, key text, value_1 text,value_2 text,value_3 text,
 . . .

value_999 text,

value_1000 text,

 PRIMARY KEY((partition,key),timestamps);

cassandra表在其支持的字段数方面是否有限制?有什么更好的方法吗?

2 个答案:

答案 0 :(得分:3)

相反,您应该执行PRIMARY KEY((partition,key), timestamps, value_id);,其中value_id为1-1000,并包含单个value文本。然后,您将能够拥有1000个值,而分区中没有巨大的行。问题是在分页时,整个行被视为单个单元。最小的单位是1000个值,因此不可能分解并做较小的块。 JVM很难为发送分配大量的连续块,这给旧的一代空间增加了巨大的负担,并且GC停顿了很长时间。

还有要考虑的分区的总大小。尽管分区的单元格限制为20亿,但Why is it so bad to have large partitions in Cassandra?中描述了一些实际限制。

答案 1 :(得分:0)

Cassandra的每个分区硬限制为2亿个细胞。您最有可能在遇到该“困难”数字之前遇到麻烦。

为了计算分区中的单元格数量,您可以使用以下公式:

nv = nr(nc - npk - ns) + ns

其中:

  • nv =分区中的单元数
  • nr =行数
  • ns =静态列数
  • nc =列数
  • npk =主键列数

nc - npk - ns也称为每行值的数量。

更多Cassandra limitations