我能够设计一个表来存储单个时间序列数据。
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表在它支持的字段数量方面有限制吗?还有更好的方法吗?
相反,你应该做PRIMARY KEY((partition,key), timestamps, value_id);
,其中value_id为1-1000和单个value
文本。然后,您将能够在分区中拥有1000个没有大行的值。问题是分页时整行被视为一个单元。最小的单位是1000个值,因此无法分解并以较小的块进行。 JVM很难为发送分配大的连续块,这给旧的gen空间和长GC暂停带来了巨大的负担。
还需要考虑分区的总大小。虽然细胞对分区的限制是20亿,但Why is it so bad to have large partitions in Cassandra?中描述了一些实际限制。
Cassandra每个分区的硬限制为20亿个单元。很可能你在达到“硬”数字之前会遇到麻烦。
要计算分区中的单元格数,可以使用以下公式:
nv = nr(nc - npk - ns) + ns
哪里:
nc - npk - ns
也称为每行的值数。