时间序列的 Cassandra Skinny vs Wide Row - 消费

Cassandra Skinny vs Wide Row for time series - consumption

我想将每秒一个值存储到 table。因此,我测试了两种相互对立的方法。如果我没理解错的话,内部存储的数据应该几乎一样。

宽行

CREATE TABLE timeseries (
  id int,
  date date,
  timestamp timestamp,
  value decimal,
  PRIMARY KEY ((id, date), timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC) AND
  compaction={'class': 'DateTieredCompactionStrategy'} 
   and  compression = { 'sstable_compression' : 'DeflateCompressor' };

瘦行

  CREATE TABLE timeseries(
    id int,
    date date,
    "0" decimal, "1" decimal,"2" decimal, -- ... 86400 decimal values
                   -- each column index is the second of the day
    PRIMARY KEY ((id, date))
) 

测试:


在我的测试中,正弦函数的瘦行方法只消耗了 100 万个值的一半存储空间。即使是随机测试也很重要。有人可以解释这种行为吗?

这些架构之间的唯一区别是单元格键

宽行模型的示例单元格:

["2017-06-09 15\:05+0600:value","3",1496999149885944]
          |                 |     |          |
       timestamp         column  value   timestamp

以及瘦行模型的示例单元格:

   ["0","3",1497019292686908]
     |   |          | 
  column value   timestamp

你可以清楚地看到宽行模型单元格键是时间戳值和值的列名。对于瘦模型,单元格键只是列名。

宽行模型的开销是时间戳(8 字节)和列名(值)的大小。您可以保持列名较小,而不是使用时间戳,使用 int 并放置当天的秒数,就像你的瘦行列名称。这将节省更多 space.