我能够设计一个表来存储单个时间序列数据。
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表在其支持的字段数方面是否有限制?有什么更好的方法吗?
答案 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
其中:
nc - npk - ns
也称为每行值的数量。